Java 反射机制

一.什么是反射机制?

JAVA反射机制是指在运行状态中,对于任意一个,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

二.反射有关的API有哪些?

Class,Method,Field,Constructor,Annotation,Package,Interface等;

获取一个类的Class对象,从Class对象中可以获得类字段信息,方法,构造函数,注解,父类和接口等信息.还可以执行方法,获取属性值等.

三.如何使用反射获取类信息?

获取一个类的Class对象,从Class对象中可以get类字段信息,方法,构造函数,注解,父类和接口等信息.还可以执行方法,获取属性值等.

下面函数列出了通过Class可以获得的信息.

  1: /**
  2:    * getMethods(Class.class,"get"); 反射获取clss类的包含前缀pre的方法
  3:    * 
  4:    * @param clazz
  5:    * @param pre
  6:    */
  7:   public static void getMethods(Class<?> clazz, String pre) {
  8:     Method[] ms = clazz.getDeclaredMethods();
  9:     for (Method m : ms) {
 10:       if (m.getName().contains(pre)) {
 11:         System.out.println(m);
 12:       }
 13:     }
 14:   }

四.如何动态实例化对象?

有两种方式:

1.通过Class的newInstance()方法实例化,类必须包含参构造方法.

2.通过Class选择一个Constructor,执行Constructor的newInstance()实例化;

 

  1: /**
  2:    * 使用构造函数需要预先知道有哪些构造函数
  1: /**
  3:    * @throws Exception
  4:    */
  5:   public static void createObject2() throws Exception {
  6:     Class<?> clazz=Class.forName("java.io.BufferedInputStream");
  7:     Constructor ctor=clazz.getConstructor(InputStream.class);
  8:     InputStream in=InstanceObjectDemo.class.getClassLoader().getResourceAsStream("InstanceObjectDemo.java");
  9:     BufferedInputStream obj=(BufferedInputStream) ctor.newInstance(in);
 10:     System.out.println(obj);
 11:     obj.close();
 12:   }
 13:   /**
 14:    * 动态实例化对象
 15:    * @param clazz
 16:    */
 17:   public static Object createObject(String className){
 18:     Object obj=null;
 19:     try {
 20:       obj=Class.forName(className).newInstance();
 21:     } catch (Exception e) {
 22:       e.printStackTrace();
 23:     }
 24:     return obj;
 25:   }

五.动态方法调用

使用Method的invoke()方法执行public的方法,对于私有方法,要先调用setAccessible(true)取消访问权限检查.

  1: /**
  2:    * 执行方法invoke()
  3:    * @throws Exception
  4:    */
  5:   public static void excMethon() throws Exception{
  6:     
  7:     String str="12abcde";
  8:     Class clazz=str.getClass();
  9:     Method m=clazz.getMethod("substring", int.class);
 10:     String result=(String) m.invoke(str, 2);
 11:     System.out.println(result);
 12:   }

六.如何访问成员变量值?

  1: /**
  2:    * 直接获取字段值,需要取消访问权限[setAccessible(true)] 
  3:    * 类Point2中有x,y两个整型字段
  4:    * @throws Exception
  5:    */
  6:   public static void accessField()throws Exception{
  7:     Point2 p=new Point2(2,3);
  8:     Class clazz=p.getClass();
  9:     Field fx=clazz.getDeclaredField("x");
 10:     Field fy=clazz.getDeclaredField("y");
 11:     
 12:     fx.setAccessible(true);
 13:     fy.setAccessible(true);
 14:     
 15:     System.out.println(fx.get(p)+","+fy.get(p));
 16:     fx.set(p, 20);
 17:     
 18:     fy.set(p, 30);
 19:     System.out.println(p);
 20:     
 21:   }

七.数组反射工具类java.lang.reflect.Array

  1: /**
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值