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;
        }
    }

         

  • 相关阅读:
    mysql创建用户,并赋予权限:只能查某个数据库中的某张表(只读)
    Fastjson toJSONString用单引号进行转换
    MyBatis传入参数为list、数组、map写法
    进制GB和GiB的区别
    leaflet 根据一个经纬度及距离角度,算出另外一个经纬度
    ubuntu下安装YApi
    Oracle 存储过程测试
    Oracle两种临时表的创建与使用详解
    一月到十二月的英文
    spring framework各个版本下载网址
  • 原文地址:https://www.cnblogs.com/ykjava/p/6806892.html
Copyright © 2011-2022 走看看