zoukankan      html  css  js  c++  java
  • JAVA的反射理解

    1----------------------------反射的概念-----------------------------------------------

    JAVA的反射机制是在运行状态中,对于一个类可以知道它的属性和方法,对于一个对象我们可以调用这个对象的属性和方法,对于这种可以动态的知道类的信息和动态调用的功能称之为JAVA的反射。

    2----------------------------作用-----------------------------------------------------

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

    生成动态代理。

    3---------------------------基本代码--------------------------------------------------

    (1)涉及到的jdk类

    java.lang.Class;                

    java.lang.reflect.Constructor; java.lang.reflect.Field;        

    java.lang.reflect.Method;

    java.lang.reflect.Modifier;

    (2)反射实例化

    Class c =Class.forName("Employee");
    //创建此Class 对象所表示的类的一个新实例  
    Objecto = c.newInstance(); //调用了Employee的无参数构造方法.

    (3)获取类中的属性

    //获取整个类  
                Class c = Class.forName("java.lang.Integer");  
                  //获取所有的属性?  
                Field[] fs = c.getDeclaredFields();  
           
                       //定义可变长的字符串,用来存储属性  
                StringBuffer sb = new StringBuffer();  
                //通过追加的方法,将每个属性拼接到此字符串中  
                //最外边的public定义  
                sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{ ");  
                //里边的每一个属性  
                for(Field field:fs){  
                    sb.append(" ");//空格  
                    sb.append(Modifier.toString(field.getModifiers())+" ");//获得属性的修饰符,例如public,static等等  
                    sb.append(field.getType().getSimpleName() + " ");//属性的类型的名字  
                    sb.append(field.getName()+"; ");//属性的名字+回车  
                }  
          
                sb.append("}");  
          
                System.out.println(sb); 

    (3)获取特定的属性
        public static void main(String[] args) throws Exception{  
                      
        <span style="white-space:pre">  </span>//以前的方式:  
            /*
            User u = new User();
            u.age = 12; //set
            System.out.println(u.age); //get
            */  
                      
            //获取类  
            Class c = Class.forName("User");  
            //获取id属性  
            Field idF = c.getDeclaredField("id");  
            //实例化这个类赋给o  
            Object o = c.newInstance();  
            //打破封装  
            idF.setAccessible(true); //使用反射机制可以打破封装性,导致了java对象的属性不安全。  
            //给o对象的id属性赋值"110"  
            idF.set(o, "110"); //set  
            //get  
            System.out.println(idF.get(o));  
        } 

    (4)调用某个类的方法

    import java.lang.reflect.Method;
    public class TestReflect {
        public static void main(String[] args) throws Exception {
            Class<?> clazz = Class.forName("net.xsoftlab.baike.TestReflect");
            // 调用TestReflect类中的reflect1方法
            Method method = clazz.getMethod("reflect1");
            method.invoke(clazz.newInstance());
            // Java 反射机制 - 调用某个类的方法1.
            // 调用TestReflect的reflect2方法
            method = clazz.getMethod("reflect2", int.class, String.class);
            method.invoke(clazz.newInstance(), 20, "张三");
            // Java 反射机制 - 调用某个类的方法2.
            // age -> 20. name -> 张三
        }
        public void reflect1() {
            System.out.println("Java 反射机制 - 调用某个类的方法1.");
        }
        public void reflect2(int age, String name) {
            System.out.println("Java 反射机制 - 调用某个类的方法2.");
            System.out.println("age -> " + age + ". name -> " + name);
        }
    }

  • 相关阅读:
    C++中 extern "C" 的两种用法
    第5章类和对象(一)
    第4章 函数和作用域
    第5章类和对象(一)
    第5章类和对象(一)续
    C++中 extern "C" 的两种用法
    extern用法详解(转)
    第4章 函数和作用域
    IOS开发中一些尺寸问题
    键盘处理IOS
  • 原文地址:https://www.cnblogs.com/taotingkai/p/6211135.html
Copyright © 2011-2022 走看看