反射机制:管理一个类的成员属性,成员方法,构造方法的步骤
- 三种方式获取Class对象
@Test//获取Class --范围:所有的字节码文件
public void test1() throws ClassNotFoundException {
//方式1--通过类名
Class c=Dog.class;//Dog.java编译后的字节码文件
Class c1=Book.class;//Book.java编译后的字节码文件
//方式2--通过对象
Class c3 = new Dog().getClass();
//方式3--通过类路径
Class c4 = Class.forName("reflect1.Book");
}
- 管理无参构造
//1.管理无参构造
@Test
public void test2() throws Exception {
//1.获取到某个类的字节码文件对象,即Class的对象
Class<Dog> c = Dog.class;
//2.帮Dog调用无参构造
Dog dog = c.newInstance();
System.out.println(dog);
}
- 管理有参构造
//2.管理有参构造
@Test
public void test3() throws Exception {
//1.获取到某个类的字节码文件对象,即Class的对象
Class<Dog> c = Dog.class;
//2.获取有参构造的管理对象--2个参数的那个
Constructor<Dog> con = c.getDeclaredConstructor(String.class,int.class);
//3.帮助Dog类调用有参构造
Dog dog = con.newInstance("旺财",2);
System.out.println(dog);
}
- 管理属性
//3.管理属性
@Test
public void test4() throws Exception {
//1.获取到某个类的字节码文件对象,即Class的对象
Class<Dog> c = Dog.class;
//2.获取某个属性的管理对象
Field f = c.getDeclaredField("name");
//先创建一个狗狗对象
Dog dog = c.newInstance();
f.setAccessible(true);//开启私有属性操作权限
//3.帮助dog给name属性赋值
f.set(dog,"来福");
System.out.println(dog);
}
- 管理方法
//4.管理方法
@Test
public void test5() throws Exception {
//1.获取到某个类的字节码文件对象,即Class的对象
Class<Dog> c = Dog.class;
//2.获取某个方法setAge(int age)的管理对象
Method m = c.getDeclaredMethod("setAge", int.class);
//先创建一个狗狗对象
Dog dog = c.newInstance();
//3.帮助dog给调用setAge方法
m.invoke(dog,3);
//System.out.println(dog);
//管理toString方法
Method m2 = c.getDeclaredMethod("toString");
System.out.println(m2.invoke(dog));
}
常用的方法:
1.获得类的构造方法可以调用类对象的以下方法:
下面展示一些 内联代码片
。
//获得所有公共的构造函数(除私有的)
Constructor[]s= Class.forName("Dog").getConstructors();
//获得指定参数公共的构造函数(除私有的)
Constructor<?> s1= Class.forName("Dog").getConstructor(String.class,int.class);
//获得所有构造函数
Constructor[]ds= Class.forName("Dog").getDeclaredConstructors();
//获得指定参数类型的构造函数
Constructor<?> ds1= Class.forName("Dog").getDeclaredConstructor(String.class,int.class);
//获得普通方法(除私有)
Method []method=Class.forName("Dog").getMethods();
//获取公共指定方法名的普通方法(除私有的)
Method method1=Class.forName("Dog").getMethod("getAge");
//获取所有的普通方法
Method []method2=Class.forName("Dog").getDeclaredMethods();
//获取指定方法名的普通方法
Method method3=Class.forName("Dog").getDeclaredMethod("getAge");
//获得成员变量
Field []field=Class.forName("Dog").getFields();
Field field1=Class.forName("Dog").getField("name");
Field []field2=Class.forName("Dog").getDeclaredFields();
Field field3=Class.forName("Dog").getField("name");