Java复习第12天---12.3---基础加强---反射2

Java复习第12天---12.3---基础加强---反射2


目录




内容

1、class对象功能

  常用功能分类

  • 获取功能
    • 获取构造器
      • Constructor[] getConstructors() //获取所有的公有构造器
      • Constructor geConstructor(类<?>… parameterTypes) // 获取指定的公有构造器
      • Constructor[] getDeclaredConstructors() // 获取所有访问权限的构造器
      • Constructor getDeclaredConstructor(类<?>… parameterTypes) // 获取指定的构造器,访问权限不限
    • 获取成员变量
      • Field[] getFields()
      • Field getField(String name) // 返回一个 Field对象,它反映此表示的类或接口的指定公共成员字段 类对象。
      • Field[] getDeclaredFields()
      • Field getDeclaredField(String name)
    • 获取方法
      • Method[] getMethods()
      • Method getMethod(String name, 类<?>… parameterTypes)
      • Method[] getDeclaredMethods()
      • Method getDeclaredMethod(String name, 类<?>… parameterTypes)
    • 获取类名
      • String getName()

2、获取Constructor

  这里我们只演示public构造器的获取,和创建对象。

  • 示例2-1:

      package reflect;
    
      public class Person {
      	private String name;
      	private int age;
    
      	public Person() {}
    
      	public Person(String name, int age) {
      		super();
      		this.name = name;
      		this.age = age;
      	}
    
      	public String getName() {
      		return name;
      	}
    
      	public void setName(String name) {
      		this.name = name;
      	}
    
      	public int getAge() {
      		return age;
      	}
    
      	public void setAge(int age) {
      		this.age = age;
      	}
    
      	@Override
      	public String toString() {
      		return "Person [name=" + name + ", age=" + age + "]";
      	}
      }
      
      package reflect;
    
      import java.lang.reflect.Constructor;
      import java.lang.reflect.InvocationTargetException;
    
      public class TestReflectConstructor {
      	public static void main(String[] args) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
      		Class<Person> cls = Person.class;
      		// 1、获取带参构造器
      		Constructor<Person> c1 = cls.getConstructor(String.class, int.class);
      		// 创建对象
      		Object obj1 = c1.newInstance("李四", 24);
      		System.out.println(obj1);
    
      		// 2、获取无参构造器
      		Constructor<Person> c2 = cls.getConstructor();
      		// 创建对象
      		Object obj2 = c2.newInstance();
      		System.out.println(obj2);
    
      		// 3、无参构造器创建对象
      		Object obj3 = cls.newInstance();
      		System.out.println(obj3);
      	}
      }
      测试结果:
      Person [name=李四, age=24]
      Person [name=null, age=0]
      Person [name=null, age=0]
    

3、获取Field

	package reflect;

	import java.lang.reflect.Field;

	public class TestReflectField {
		public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
			Class<Person> cls = Person.class;
			// 1、getFields
			Field[] f1 = cls.getFields();
			for(Field f: f1) {
				System.out.println(f);
			}
			System.out.println("========");
			// 2、getDeclaredFields
			Field[] f2 = cls.getDeclaredFields();
			for(Field f: f2) {
				System.out.println(f);
			}
			System.out.println("========");
			// 3、getField(String name)

			Field f3 = cls.getDeclaredField("name");
			f3.setAccessible(true);
			Person p = new Person();
			f3.set(p, "王五");
			Object obj3 = f3.get(p);
			System.out.println(obj3);
		}

	}
  • 分析:
    • 想要获取非公有的属性,需要加declared
    • set,get为设置和获取属性的值
    • 想要使用非公有的属性,需要调用setAccessible(true)方法

4、获取Method

  这里只演示公有带参成员方法的获取和使用

  • 示例4-1:

      package reflect;
    
      public class Person {
      	private String name;
      	private int age;
      	public int a;
      	protected int b;
      	int c;
    
      	public Person() {}
    
      	public Person(String name, int age) {
      		super();
      		this.name = name;
      		this.age = age;
      	}
    
      	public String getName() {
      		return name;
      	}
    
      	public void setName(String name) {
      		this.name = name;
      	}
    
      	public int getAge() {
      		return age;
      	}
    
      	public void setAge(int age) {
      		this.age = age;
      	}
    
      	@Override
      	public String toString() {
      		return "Person [name=" + name + ", age=" + age + "]";
      	}
    
      	public void eat(String food) {
      		System.out.println(" eat " + food);
      	}
      }
      
      package reflect;
    
      import java.lang.reflect.InvocationTargetException;
      import java.lang.reflect.Method;
    
      public class TestReflectMethod {
      	public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
      		Class<Person> cls = Person.class;
    
      		Method eat = cls.getMethod("eat", String.class);
      		Person p = new Person();
      		eat.invoke(p, "馒头");
      	}
      }
      测试结果:
       eat 馒头
    

5、案例

  • 需求:创建任务类型的对象,执行该对象的任意无参方法

  • 分析:

    • 配置文件:配置全类名,配置方法名
    • 通过Properties读取配置
    • 利用反射创建对象并执行方法
  • 代码5-1:

      package reflect;
    
      public class Person {
      	private String name;
      	private int age;
      	public int a;
      	protected int b;
      	int c;
    
      	public Person() {}
    
      	public Person(String name, int age) {
      		super();
      		this.name = name;
      		this.age = age;
      	}
    
      	public String getName() {
      		return name;
      	}
    
      	public void setName(String name) {
      		this.name = name;
      	}
    
      	public int getAge() {
      		return age;
      	}
    
      	public void setAge(int age) {
      		this.age = age;
      	}
    
      	@Override
      	public String toString() {
      		return "Person [name=" + name + ", age=" + age + "]";
      	}
    
      	public void eat(String food) {
      		System.out.println(" eat " + food);
      	}
    
      	public void eat() {
      		System.out.println("吃东西");
      	}
      }
      
      package reflect;
    
      import java.lang.reflect.Method;
      import java.util.Properties;
    
      public class TestReflect {
      	public static void main(String[] args) throws Exception{
      		ClassLoader cl = TestReflect.class.getClassLoader();
      		Properties prop = new Properties();
    
      		prop.load(cl.getResourceAsStream("instance.properties"));
      		String className = prop.getProperty("className");
      		String methodName = prop.getProperty("methodName");
    
      		Class cls = Class.forName(className);
      		Method method = cls.getDeclaredMethod(methodName);
      		Object obj = cls.newInstance();
      		method.invoke(obj, null);
      //		
      	}
      }
      
      instance.properties 配置文件内容:
      className=reflect.Person
      methodName=eat
      
      测试结果:
      吃东西
    

  执行带参方法可以自己研究下,暂时没研究。

后记

  本项目为参考某马视频开发,相关视频及配套资料可自行度娘或者联系本人。上面为自己编写的开发文档,持续更新。欢迎交流,本人QQ:806797785

前端项目源代码地址:https://gitee.com/gaogzhen/vue-leyou
    后端JAVA源代码地址:https://gitee.com/gaogzhen/JAVA

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章