java反射Demo练习题

news/2024/5/19 4:21:17 标签: 反射, java

java反射 练习题

package hello;

import java.io.FileReader;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Properties;
import java.util.Scanner;

public class Reflect {
	public static void main(String[] args) throws Exception {
		
//		fanxingDemo();
//		newObject1();
//		newObject2();
//		printStr();
//		showObj();
//		setProperty(new Book(),"title","张三");
//		beanDemo();
		// run();
		System.out.println(getProperty(new Book("xiao受那个书", 40),"title"));
		
	}
	
	// 8. 写一个方法,此方法可以获取obj对象中名为propertyName的属性的值
	private static Object getProperty(Book book, String title) throws Exception {
		Class c = book.getClass();
		Field field = c.getDeclaredField(title);
		field.setAccessible(true);
		Object f = field.get(book);
		return f;
	}

	// 7.(1)写一个Properties格式的配置文件,配置类的完整名称。
    // (2) 写一个程序,读取这个Properties配置文件,获得类的完整名称并加载这个类,
    // (3)反射 的方式运行run方法。
    private static void run() throws Exception {
        Properties pro = new Properties();
        // 注意:如果是用Eclise的话,切记要右键工程名字,新建一个file文件,因为如果file文件不在工程根目录的话,它是找不到的。
        FileReader fr = new FileReader("config.properties");
        pro.load(fr);
        fr.close();

        String className = pro.getProperty("className");
        String MethodName = pro.getProperty("MethodName");
        Class c = Class.forName(className);
        Object obj = c.newInstance();
        Method method = c.getMethod(MethodName);
        method.invoke(obj);

    }
	
	// 6.定义一个标准的JavaBean,名叫Person,包含属性name、age。
    // 使用反射的方式创建一个实例、调用构造函数初始化name、age,使用反射方式调用setName方法对名称进行设置,
    // 不使用setAge方法直接使用反射方式对age赋值。
	private static void beanDemo() throws Exception {
		Class c = Class.forName("hello.Book");
		Constructor cons = c.getConstructor(String.class,int.class);
		Object obj = cons.newInstance("xiaohognshu",30);
		Method method = c.getDeclaredMethod("setTitle", String.class);
		method.invoke(obj, "小红书");						// 反射方式调用setName方法对名称进行设置
		System.out.println(obj);
		Field field = c.getDeclaredField("num");
		field.setAccessible(true);
		field.set(obj, 20);
		System.out.println(obj);
	}

	// 5. 写一个方法,此方法可将obj对象中名为propertyName的属性的值设置为value.
	private static void setProperty(Object obj, String propertyName, String value) throws Exception {
		Class cla = obj.getClass();
		Field field = cla.getDeclaredField(propertyName);	// 获得包括私有和公有的属性
		field.setAccessible(true);							// 还要配合这个,取消权限检查,才能设置属性
		field.set(obj,propertyName);
		System.out.println(obj);
	}

	// 4.编写一个类A,增加一个实例方法showString,用于打印一条字符串,在编写一个类TestA
    // ,作为客户端,用键盘输入一个字符串,该字符串就是类A的全名,
    // 使用反射机制创建该类的对象,并调用该对象中的方法showString
	private static void showObj() throws Exception {
		Scanner scaner = new Scanner(System.in);
		System.out.println("输入一个全类名:");
		String str = scaner.nextLine();
		Class cla = Class.forName(str);
		Object obj = cla.newInstance();
		Method method = cla.getMethod("getTitle");
		method.invoke(obj);
		System.out.println(obj);
	}

	// 3. 编写一个类,增加一个实例方法用于打印一条字符串。并使用反射手段创建该类的对象, 并调用该对象中的方法。
	private static void printStr() throws Exception {
		Class cla = Class.forName("hello.Book");
		Object book =  cla.newInstance();
		Method method = cla.getMethod("toString");
		method.invoke(book);
		System.out.println(book);
		
	}

	// 2.反射创建对象,用两种方法实现
	private static void newObject1() throws Exception {
		Class cla = Class.forName("hello.Book");
		Constructor cons = cla.getConstructor(String.class,int.class);
		Object obj = cons.newInstance("xihaongshu",30);
		System.out.println(obj);
	}
	
	private static void newObject2() throws Exception {
		Class cla = Class.forName("hello.Book");
		Object obj = cla.newInstance();
		System.out.println(obj);
	}

	// 1.泛型类型擦除
	private static void fanxingDemo() throws Exception {
		ArrayList<String> arrays = new ArrayList<String>();
		arrays.add("begin");
		Class cla = Class.forName("java.util.ArrayList");
		Method method = cla.getMethod("add", Object.class);
		method.invoke(arrays, "ttt");
		for(Object obj:arrays) {
			System.out.println(obj);
		}
	}

}


http://www.niftyadmin.cn/n/776590.html

相关文章

java中IO练习题

转载链接&#xff1a;https://www.cnblogs.com/biehongli/p/6074713.html Java中IO流&#xff0c;输入输出流概述与总结 1&#xff1a;Java语言定义了许多类专门负责各种方式的输入或者输出&#xff0c;这些类都被放在java.io包中。其中&#xff0c; 所有输入流类都是抽象类…

java中file总结

File类是IO包中唯一代表磁盘文件本身的对象。通过File来创建&#xff0c;删除&#xff0c;重命名文件。File类对象的主要作用就是用来获取文本本身的一些信息。如文本的所在的目录&#xff0c;文件的长度&#xff0c;读写权限等等。&#xff08;有的需要记忆&#xff0c;比如is…

Java IO流经典练习题

链接&#xff1a;https://blog.csdn.net/chenjiandatyy/article/details/78808049 本文对javaIO流的13道经典的练习题做解答&#xff0c;里面有详细的思路解析&#xff0c;做题时最好养成先写思路在编程的习惯。 一&#xff0e;练习的题目 &#xff08;一&#xff09; 在电脑…

如何在官网下载MySQL连接数据库所需要的jar包

官网下载地址&#xff1a;官网中的JDBC下载页面的链接 1.进入到MYSQL官网&#xff0c;点击DOWNLOADS,如图&#xff1a; 选择对应的版本&#xff0c;我要用java版本的&#xff0c;所以选择Connector/J 2.选择对应的平台 3.选择第二个 4. 点击最后的一行字

java工厂模式三种详解

转载&#xff1a;https://blog.csdn.net/llussize/article/details/80276627 工厂方法模式&#xff08;Factory Method&#xff09; 工厂方法模式分为三种&#xff1a; 1、普通工厂模式&#xff0c;就是建立一个工厂类&#xff0c;对实现了同一接口的一些类进行实例的创建。…

eclipse没有server选项解决方法

链接1&#xff1a;https://www.cnblogs.com/xiaoxiaoweng/p/7298183.html 链接2&#xff1a;https://blog.csdn.net/zs20082012/article/details/79083890 eclipse是是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言&#xff0c;它只是一个框架和一组服务&#xff…

Eclipse开发JavaWeb项目配置Tomcat,详细教程

链接&#xff1a;https://blog.csdn.net/zs20082012/article/details/79138204 首先介绍eclipse开发JavaWeb项目需要配置的相关环境&#xff0c;使用tomcat软件在本地搭建服务器&#xff0c;然后再在eclipse环境下配置tomcat&#xff1a; 第一步&#xff1a;使用tomcat软件在本…

jstl标签库方法下载,eclipse配置方法

链接&#xff1a;https://www.cnblogs.com/wangpengpeng/p/6889066.html 链接&#xff1a;https://www.cnblogs.com/shaonian404/p/8437949.html jsp引用JSTL核心标签库 一、引用JSTL 1、 JSTL的引入可以让JSP代码中<%%>等代码消失掉&#xff0c;再结合EL表达式&#…