反射

获取Class类对象的方式

  • 有三种:
  •    a) 通过对象获取
    
  •         Person obj = new Person();
    
  •         Class c =obj.getClass();
    
  •    b)通过静态属性获取
    
  •         Class c = Person.class;
    
  •    c)通过静态方法获取,使用字符串表示的类名
    
  •         Class c = Class.forName("类的全路径");
    
  • 如果是基本数据类型,可以通过TYPE的方式获取class对象
  •     Class c = Integer.Type;
    

通过反射获取构造方法,并且创建对象

  • Class的成员方法
  •    public Constructor<?>[] getConstructors() :返回该类的所有公共构造方法
    
  •    public Constructor<?>[] getDeclaredConstructors() :返回该类的所有构造方法
    
  •    public Constructor<T> getConstructor(Class<?>... parameterTypes) :返回该类的一个公共构造方法
       例:
       Constructor constructor = c.getDeclaredConstructor(String.class);
       System.out.println(constructor.toString());
       获取到只有一个string参数的构造方法:private reflect.Student(java.lang.String)
    
  • Constructor的成员方法
  •    public Object newInstance(Object... initargs)
    
  •    不能直接将私有构造方法new对象
    
  •    constructor.setAccessible(true);
       例:
       Object object = constructor.newInstance("张三");
    

通过反射获取成员变量并使用

  • Class类的成员方法
  •    getFields():获取该类所有公共变量
    
  •    getDeclaredFields:获取该类所有变量
    
  •    public Field getField(String name):获取该类指定名称的公共变量
    
  •    public Field getDeclaredField(String name):获取该类指定名称的变量
    
  • Field类的成员方法
  •    public void set(Object obj,Object value):给指定对象的该属性修改值
    
  •    私有变量暴力访问
    
  •    field2.setAccessible(true);
       例:
       Constructor constructor = c.getConstructor();
       Object object = constructor.newInstance();
       field.set(object, "北京");
    

通过反射获取成员方法并使用

  • Class类的成员方法
  •    getMethods():获取所有公共方法
    
  •    会将父类的公共方法都获取到
       例:
       public final void java.lang.Object.wait()
       public final void java.lang.Object.wait(long,int)
       public final native void java.lang.Object.wait(long)
       public boolean java.lang.Object.equals(java.lang.Object)
       public native int java.lang.Object.hashCode()
       public final native java.lang.Class java.lang.Object.getClass()
       public final native void java.lang.Object.notify()
       public final native void java.lang.Object.notifyAll()
    
  •    getDeclaredMethods():获取所有方法
    
  •    public Method getMethod(String name,Class<?>... parameterTypes):获取该类一个公共方法
    
  •    public Method getDeclaredMethod(String name,Class<?>... parameterTypes):获取该类一个任意方法
       例:
       Method method = c.getDeclaredMethod("show");
       method.invoke(object);
       Method method2 = c.getDeclaredMethod("method", String.class);
       method2.invoke(object, "张三");
       Method method3 = c.getDeclaredMethod("method3", String.class);
       暴力访问
       method3.setAccessible(true);
       Object result = method3.invoke(object, "张三");
    

class.newInstance()调用的是类的无参构造方法,所以类的无参构造方法最好有, JDK1.9以后,此方法已弃用,用constructor.newInstance()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值