zoukankan      html  css  js  c++  java
  • java 反射(Reflection) 详解

       

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

      众所周知哈 java ,c++,c#这类语言不属于动态语言;而目前的结论是 在程序运行状态中能允许改变变量类型和程序结构的被称之为动态语言;但是java Reflection 具备看透class 的能力这种能力被称为introspection (内省,内观) (面试重点 需要的同学可以自行百度详细了解一下  我能力有限讲不明白)(只有java  提供反射机制  像c++,c#等 非动态语言没有提供)

    java 反射机制提供的功能  (注意:大前提是在运行状态下):

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

    java 反射机制的主要类 主要位于 java.lang.reflet 

    • Class类  代表一个类
    •   Filed类   代表类的成员变量
    •   Method  代表类的方法
    •   Constructor 代表类的构造方法
    •   Array 提供动态创建数组以及访问数组中元素的静态方法

    Java 通过反射获取某个类里所有的方法   直接上代码 :

    java获取class 类的三种方法:

    •  class.froname("类的路径")
    • 类名.class
    • 实例.getclass

        

      /*   实例 操作   */
        public static void main(String[] args ) throws ClassNotFoundException {
    
            /*获得字符串服表示的类的 class 对象*/
            Class<?> aClass= Class.forName("java.lang.String");
    
            /*  可以获取里面 的所有方法  */
            Method[] methods = aClass.getDeclaredMethods();
            for(Method method : methods){
    
                System.out.println(method);
            }

    结果 :

     java  反射动态的调用某个类的特定的方法  首先要获取该类的Method  方法  对于类的成员变量和构造方法类似  首先要获取 Filed 和 Constroutor

     
     /*普通方法 */
            public int add (int a,int b)
            {
                return  a+b;
            }
    
             public static  void main(String[] args ) throws Exception {
    
                 /*  通过 .class  方法 获取  该类中的所有对象  */
                 Class<?> aClass = Reflections.class;
                 /* 生成该类的实例化对象 创建一个新的实例 */
                 Object reflection = aClass.newInstance();
                 /*  判断  reflectiong  是否是  Reflections 的实例    返回结果为true */
                 System.out.println( reflection instanceof  Reflections );
    
                 /* 通过这个类的 getmethod 方法获取到 该类的 add 方法 */
                 Method add = aClass.getMethod("add",new Class[]{int.class,int.class});
                /*反射方式 操作获取到的方法 */
                Object result = add.invoke(reflection,new Object[]{1,2});
    
                 System.out.println((Integer)result); //結果為3 
             }
                /* 完成对 gflection 的拷贝工作 */
                public Object copy (Object object) throws Exception {
                    Class<?>  aClass = object.getClass();
                    System.out.println(aClass);
                    /* 获取构造方法 */
                    Constructor con = aClass.getConstructor(new Class[]{String.class,int.class});
                    Object gbj = con.newInstance(new Object[]{"杨一",1});
                    System.out.println(gbj);
                    /*获得独享的所有成员变量*/
                    Field[] fields = aClass.getDeclaredFields();
                    for (Field field :fields){
                        String name = field.getName();
                        System.out.println(name);
                    }
                    return null;
                }
                public static void main(String[] args) throws  Exception{
                    Reflections reflections = new Reflections();
                     reflections.copy(new gflection());
    
                }
    
    }
    
    /**/
    class  gflection {
    
        private  int age;
        private String name;
    
        /*  第一个构造方法 */
        public gflection(){
    
        }
        /* 带参数的构造方法 */
        public gflection(String name,int age){
    
            this.age = age;
            this.name = name;
        }
    
        /*get set 方法*/
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }

     附上测试代码:

    import javafx.scene.effect.Reflection;
    
    import javax.xml.ws.spi.Invoker;
    import java.io.File;
    import java.lang.reflect.*;
    /**
     * Created by 杨一 on 2017/5/4.
     */
    
    
    public class Reflections {
       /* *//*   实例 操作   *//*
        public static void main(String[] args ) throws ClassNotFoundException {
            *//*获得字符串服表示的类的 class 对象*//*
            Class<?> aClass= Class.forName("java.lang.String");
    
            *//*  可以获取里面 的所有方法  *//*
            Method[] methods = aClass.getDeclaredMethods();
            for(Method method : methods){
    
                System.out.println(method);
            }
        }*/
     /*       *//*普通方法 *//*
            public int add (int a,int b)
            {
                return  a+b;
            }*/
           /*  public static  void main(String[] args ) throws Exception {
    
                 *//*  通过 .class  方法 获取  该类中的所有对象  *//*
                 Class<?> aClass = Reflections.class;
                 *//* 生成该类的实例化对象 创建一个新的实例 *//*
                 Object reflection = aClass.newInstance();
                 *//*  判断  reflectiong  是否是  Reflections 的实例    返回结果为true *//*
                 System.out.println( reflection instanceof  Reflections );
    
                 *//* 通过这个类的 getmethod 方法获取到 该类的 add 方法 *//*
                 Method add = aClass.getMethod("add",new Class[]{int.class,int.class});
                *//*反射方式 操作获取到的方法 *//*
                Object result = add.invoke(reflection,new Object[]{1,2});
    
                 System.out.println((Integer)result); //結果為3
             }*/
    
    
                /* 完成对 gflection 的拷贝工作 */
                public Object copy (Object object) throws Exception {
                    Class<?>  aClass = object.getClass();
                    System.out.println(aClass);
                    /* 获取构造方法 */
                    Constructor con = aClass.getConstructor(new Class[]{String.class,int.class});
                    Object gbj = con.newInstance(new Object[]{"杨一",1});
                    System.out.println(gbj);
                    /*获得独享的所有成员变量*/
                    Field[] fields = aClass.getDeclaredFields();
                    for (Field field :fields){
                        String name = field.getName();
                        System.out.println(name);
                    }
                    return null;
                }
                public static void main(String[] args) throws  Exception{
                    Reflections reflections = new Reflections();
                     reflections.copy(new gflection());
    
                }
    
    }
    
    /**/
    class  gflection {
    
        private  int age;
        private String name;
    
        /*  第一个构造方法 */
        public gflection(){
    
        }
        /* 带参数的构造方法 */
        public gflection(String name,int age){
    
            this.age = age;
            this.name = name;
        }
    
        /*get set 方法*/
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }

         

  • 相关阅读:
    jmeter接口测试--循环获取网页中的html链接
    jmeter接口测试--文件下载
    jmeter接口测试--文件上传
    微信群发消息小工具 v1.0-可定时发送
    xmrig 源码转为vs2015项目--总结
    nginx---max_connections、meme.type、default_type
    字典 dict
    元祖 tuple
    列表list
    字符串常用方法
  • 原文地址:https://www.cnblogs.com/ykjava/p/6806892.html
Copyright © 2011-2022 走看看