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