获取反射类的三种方法:
1. Class.forName("类所在的包和类名");
Class class1 = Class.forName("com.qfedu.a_reflect.Person");
2:类名.class
Class class2 = Person.class;
3.:对象.getClass();
Class class3 = new Person(1,"jugg").getClass();
通过反射获取构造方法
1.获取所有的public构造方法
Constructor[] constructors = cls.getConstructors();
2.获取包括私有化的所有构造方法
Constructor[] allConstructors = cls.getDeclaredConstructors();
3.通过参数,获取指定的构造方法
Constructor aConstructor = cls.getConstructor(int.class, String.class);
4.通过参数,获取指定的构造方法(包括私有的)
Constructor privateConstructor = cls.getDeclaredConstructor(null);
5.反射后,通过构造方法,创建对象。如果是私有化构造方法,要给予操作权限。
privateConstructor.setAccessible(true);
Person p2 = (Person) privateConstructor.newInstance(null);
p2.setId(2);
p2.setName("刘德华");
System.out.println(p2);
通过反射,获取方法
Class cls = Class.forName("com.qfedu.a_reflect.Person");
Person p = (Person) cls.getConstructor(int.class, String.class).
newInstance(1, "狗蛋");
1.获取所有非私有化的方法,包括从父类中继承的
Method[] allPublicMethods = cls.getMethods();
2.获取私有化在内的所有方法,过滤掉继承的方法
Method[] allMethods = cls.getDeclaredMethods();
3.获取指定的方法(非私有化)
Method aPublicMethod = cls.getMethod("sleep", int.class);
获取后,方法的使用:
aPublicMethod.invoke(p, 15);
4.获取指定的方法(包括私有化,使用的时候要授权)
Method aPrivateMethod = cls.getDeclaredMethod("testPrivate", null);
aPrivateMethod.setAccessible(true);
aPrivateMethod.invoke(p, null);
5.获取一个静态方法
Method aPublicStaticMethod = cls.getMethod("eat", null);
aPublicStaticMethod.invoke(null, null);
反射,获取字段
//加载字节码文件,获取Class类对象
Class cls = Class.forName("com.qfedu.a_reflect.Person");
1.获取所有用public修饰的成员变量
Field[] allPublicFields = cls.getFields();
2.暴力反射,获取私有化在内的成员变量
Field[] allFields = cls.getDeclaredFields();
3.获取指定的字段(非私有化)
Field aPublicField = cls.getField("test");
//通过set方法,对对象进行赋值
//set(Oject obj, Object value);
//第一个参数: 要操作的是哪一个对象里面的成员变量
//第二个参数: 需要设置的值
Person p = (Person) cls.getConstructor(int.class, String.class).
newInstance(1, "狗蛋");
aPublicField.set(p, 20);
System.out.println(p.test);
4.获取静态的字段
Field aStaticField = cls.getField("testStatic");
int num = aStaticField.getInt(cls);
System.out.println("获取int的静态字段值,转化为int的令一个原始类型的值" + num);
System.out.println(aStaticField);
aStaticField.set(null, 20);
System.out.println(Person.testStatic);
5.获取私有化的指定字段,使用时要授权
Field aPrivateField = cls.getDeclaredField("id");
System.out.println(aPrivateField);
aPrivateField.setAccessible(true);
aPrivateField.set(p, 10);
System.out.println(p.getId());
网友评论