黑马程序员-Java中的反射

JAVA中的反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法。

1、得到类的属性

public Object getProperty(Object owner, String fieldName) throws Exception {  
     Class ownerClass = owner.getClass();  //得到对象的class
   
     Field field = ownerClass.getField(fieldName);  //通过class得到类的属性
   
     Object property = field.get(owner);  //通过对象得到该属性的实例。
     
     
}  

2、得到类的静态属性

public Object getStaticProperty(String className, String fieldName)  
             throws Exception {  
     Class ownerClass = Class.forName(className);  
   
     Field field = ownerClass.getField(fieldName);  
     //这里和上面有些不同,因为该属性是静态的,所以直接从类的Class里可以得到
     Object property = field.get(ownerClass);
   
     return property;  
}  
3、执行对象的方法

public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception {  
   
     Class ownerClass = owner.getClass();  
   
     Class[] argsClass = new Class[args.length];  
   
     for (int i = 0, j = args.length; i < j; i++) {  
         argsClass[i] = args[i].getClass();  
     }  
  
      Method method = ownerClass.getMethod(methodName,argsClass);  //得到要执行的方法
   
     return method.invoke(owner, args);  
}  
4、执行某个类的静态方法

public Object invokeStaticMethod(String className, String methodName,  
             Object[] args) throws Exception {  
     Class ownerClass = Class.forName(className);  
   
     Class[] argsClass = new Class[args.length];  
   
     for (int i = 0, j = args.length; i < j; i++) {  
         argsClass[i] = args[i].getClass();  
     }  
   
    Method method = ownerClass.getMethod(methodName,argsClass);  
   
     return method.invoke(null, args);  //因为是静态方法所以不需要实例
 }  
5、新建对象

public Object newInstance(String className, Object[] args) throws Exception {  
     Class newoneClass = Class.forName(className);  
   
     Class[] argsClass = new Class[args.length];  
   
     for (int i = 0, j = args.length; i < j; i++) {  
         argsClass[i] = args[i].getClass();  
     }  
   
     Constructor cons = newoneClass.getConstructor(argsClass);  
   
     return cons.newInstance(args);  //创建对象
   
}  

知识点总结:

反射的基石-->Class类

java程序中的各个Java类属于同一类事物,描述这类事物的Java类名就是Class。
Class对象保存的是某个类的字节码;
得到字节码的三种方式:
1、Class.forname("java.long.String")//反射所用到的获取字节码的方式
2、Object.getClass();
3、Object.class
同一个类的字节码在内存中只存在一份,类的不同的实例用同一份字节码
Class中的一些方法:
ifPrimitive();判断字节码是不是基本的类型
Integer.TYPE为包装类型的基本的字节码
int[].class.isArray();是不是一个数组类型的字节码
.getConstructors();构造方法的反射,返回的是一个Constructor对象数组
.getField("成员变量名")OR .getFields();成员变量的反射,获得的field不是对象上的变量而是类上的
.getMethod("方法的名字",参数类型Object.class);成员方法的反射(Method)
.newInstance();调用不带参数的构造方法
.getConstructor(Object.class);得到有相应参数类型的构造方法,返回的是一个Constructor对象(newInstance(new Object()))
总之,只要是在源程序中出现的类型,都有各自的Class实例对象
反射的定义:反射就是把Java类中的各种成分映射成相应的Java类。




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值