day44-反射03( 三 )


文章插图

day44-反射03

文章插图
4.通过反射创建对象
  1. 方式一:调用类中的public修饰的无参构造器
  2. 方式二:调用类中的指定构造器
  3. Class类的相关方法
    • newInstance:调用类中的无参构造器,获取对应类的对象
    • getConstructor(Class...clazz):根据参数列表,获取对应的public构造器对象
    • getDecalaredConstructor(Class...clazz):根据参数列表,获取对应的所有构造器对象
  4. Constructor类相关方法
    • setAccessible:暴破
    • newInstance(Object...obj):调用构造器
例子:
package li.reflection;import java.lang.reflect.Constructor;//演示通过反射机制创建实例public class ReflectCreatInstance {public static void main(String[] args) throws Exception {//1.先获取到User类的Class对象Class<?> userClass = Class.forName("li.reflection.User");//2.通过public的无参构造器创建实例Object o = userClass.newInstance();System.out.println(o);//3.通过public的有参构造器创建实例/***此时的 constructor 对象 就是*public User(String name) {//public有参构造器*this.name = name;*}*///3.1先得到对应的构造器Constructor<?> constructor = userClass.getConstructor(String.class);//3.2再去创建实例,并传入实参Object bob = constructor.newInstance("bob");System.out.println(bob);//4.通过非public的有参构造器创建实例//4.1得到private的构造器对象Constructor<?> declaredConstructor =userClass.getDeclaredConstructor(int.class, String.class);//4.2创建实例//暴破(暴力破解),使用反射可以访问 私有的构造器/私有的属性/私有的方法declaredConstructor.setAccessible(true);Object user2 = declaredConstructor.newInstance(99, "张三丰");System.out.println(user2);}}class User {//User类private int age = 10;private String name = "jack";public User() {//public无参构造器}public User(String name) {//public有参构造器this.name = name;}private User(int age, String name) {//private有参构造器this.age = age;this.name = name;}@Overridepublic String toString() {return "User [age=" + age + ", name=" + name + "]";}}
day44-反射03

文章插图
5.通过反射访问类中的成员
  • 访问属性
    1. 根据属性名获取Field对象
      Field f = class对象.getDeclaredField(属性名);
    2. 爆破:f.setAccessible(true);//f是Field
    3. 访问
      f.set(o,值);//o表示对象
      syso(f.get(o));//o表示对象
    4. 注意:如果是静态属性,则set和get中的参数o,可以写为null
例子:
package li.reflection;import java.lang.reflect.Field;//演示反射操作属性Fieldpublic class ReflectAccessProperty {public static void main(String[] args) throws Exception {//1.得到Student类对应的Class对象Class<?> stuClass = Class.forName("li.reflection.Student");//2.创建对象Object o = stuClass.newInstance();//o的运行类型就是StudentSystem.out.println(o.getClass());//Student//3.使用反射得到age属性对象(公有)Field age = stuClass.getField("age");age.set(o,88);//通过反射来操作属性System.out.println(o);//Student [age=88, name = null]//或者System.out.println(age.get(o));//返回age属性的值 88//4.使用反射操作name属性(私有静态的属性)Field name = stuClass.getDeclaredField("name");//因为name是私有的属性,需要对 name进行爆破name.setAccessible(true);name.set(o,"jack");//也可以写name.set(null,"jack");因为name是静态属性,与类有关,与对象无关System.out.println(o);System.out.println(name.get(o));//jack}}class Student {public int age;private static String name;public Student() {}@Overridepublic String toString() {return "Student [age=" + age + ", name = " + name + "]";}}

经验总结扩展阅读