java反射

一 反射机制

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

 

主要是指程序可以访问、检测和修改它本身状态或行为的一种能力

提供以下功能:

     1>在运行时判断任意一个对象所属的类

     2>在运行时构造任意一个类的对象

     3>在运行时判断任意一个类所具有的成员变量方法

     4>在运行时调用任意一个对象的方法

     5>生成动态代理

 

 

二 Java反射机制主要提供下面几种用途:

  • 在运行时判断任意一个对象所属的类
  • 在运行时构造任意一个类的对象
  • 在运行时判断任意一个类所具有的成员变量和方法
  • 在运行时调用任意一个对象的方法

 使用java的反射机制,一般需要遵循三步:

         1.获得你想操作类的Class对象

             1.1 获取Class对象 Class<?> cls = Class.forName("com.test.App");

                                          每个Class都继承了Object类,Object类中有getClass()方法

                                           String temp = "";

                                           Class<?> cla1 = temp.getClass();      

         2.通过第一步获得的Class对象去取得操作类的方法或是属性名
         3. 获得对象,用构造方法对象调用构造方法,如果使用无参构造方法,
                         直接使用" 类对象.newInstance() "方法来获得这个类的对象 
         3.操作第二步取得的方法或是属性
         

     Java运行的时候,某个类无论生成多少个对象,他们都会对应同一个Class对象,它表示正在运行程序中的类和接口。

  java.lang.reflect包下的三个重要类: 
        Field属性类:用来描述属性的信息。 
        Method方法类:方法的信息的描述。 
        Constructor构造方法类:用来描述构造方法的信息。 
 
    Class类中的常用方法: 
        newInstance()  
            创建此 Class 对象所表示的类的一个新实例(调用无参构造创建的对象)。 
        getDeclaredMethods() 
            获得的是一个Method方法类对象的数组,获得本类(不包括父类)声明的所有(包括private的)方法对象。 
        getMethods()     //推荐使用 
            获得的是一个Method方法类对象的数组,获得所有(父类的也包括)publice的方法对象。 
        getDeclaredConstructors() 
            获得的是一个Constructor构造方法类对象的数组,获得这个类声明的所有构造方法对象。 
        getConstructors()    //推荐使用 
            获得的是一个Constructor构造方法类对象的数组,获得所有publice的构造方法对象。 
        getDeclaredFields()    //推荐使用 
            获得的是一个Field属性类对象的数组,获得本类声明的所有属性的属性对象。 
        getFields() 
            获得的是一个Field属性类对象的数组,获得所有publice的属性对象。 
             

    下面用一个例子说明一下:

    public class ReflectClass{

        public static void main(String[] args) throws Exception {      

                Person p1 = new Person();

                p1.setValue("Tom", 18);

                Person p2 = new Person();  

                 copyProperty(p1, p2);   

          }

         private static void copyProperty(Object from, Object dest) throws Exception {

           /*******取得拷贝源对象的Class对象*/

           Class<?> fromClass = from.getClass();

           /*****取得拷贝源对象的属性列表****/

           Field[] fromFields = fromClass.getDeclaredFields();

           /********取得拷贝目标对象的Class对象*/

            Class<?> destClass = dest.getClass();

            Field destField = null;

            for (Field fromField : fromFields) {

                    /**取得拷贝源对象的属性名字****/

                   String name = fromField.getName();

                    /****取得拷贝目标对象的相同名称的属性****/

                    destField = destClass.getDeclaredField(name);

                     /*****设置属性的可访问性,这个设置用来直接设置访问属性的值*****/

                    fromField.setAccessible(true);

                    destField.setAccessible(true);

                      /*****将拷贝源对象的属性的值赋给拷贝目标对象相应的属性*****/

                     destField.set(dest, fromField.get(from));

                     /***

                       * 注意这里的get,千万不能跟程序里面的getName()属性搞混了,这个就是直接获取值的意思

                       * 这里的set就是跟赋值‘=’类似

                       */

                 }

               }

        }

       class Person {

             /** 姓名 */

           private String name;

            /** 年龄 */

           private int age;

           public void setValue(String name,int age){

                   this.name = name;

                   this.age = age;

            }

           public void work(String name){

            System.out.println(name + ", will start to work")

          }

       }

 
在反射中我们还常见一个方法调用的使用
         Person p1= new Person();
// 获得Class
Class<?> cls = p1.getClass();
// 通过Class获得Person类的work方法
Method method = cls.getMethod("work", String.class);
// 调用work方法
method.invoke(p1, "Tom");
另外还有一个注意点:在获得类的方法、属性、构造函数时,会有getXXX和getgetDeclaredXXX两种对应的方法。
getXXX:返回的是访问权限为public的方法和属性,包括父类中的;
getgetDeclaredXXX:返回所有本类中定义的访问权限是public的方法和属性,父类的除外。
 
 
列出几个常用的本类获取方法,和构造方法,

方法关键字

含义

getDeclaredMethods()

获取所有的方法

getReturnType()

获得方法的放回类型

getParameterTypes()

获得方法的传入参数类型

getDeclaredMethod("方法名",参数类型.class,……)

获得特定的方法

 
 

构造方法关键字

含义

getDeclaredConstructors()

获取所有的构造方法

getDeclaredConstructor(参数类型.class,……)

获取特定的构造方法

 
 

父类和父接口

含义

getSuperclass()

获取某类的父类

getInterfaces()

获取某类实现的接口

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值