zoukankan      html  css  js  c++  java
  • Java反射(一眼就看会)

    
    
    参考:
    (1)http://blog.csdn.net/liujiahan629629/article/details/18013523
    (2)https://www.zhihu.com/question/24304289/answer/150310001  作者:meepo
    作为小白,结合各位大神的回答,吐血总结:



    JAVA反射机制:


    (1)在运行状态中
    (2)对于任意一个类,都能够知道这个类的所有属性和方法;
    (3)对于任意一个对象(类的一个实例),都能够调用(访问,检测和修改)这个类的任意一个方法和属性;

    这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。

    反射机制的作用:

      1.  反编译:.class-->.java

      2.  通过反射机制访问java对象的属性,方法,构造方法等;


    实例:

    一、反射机制获取类有三种方法
    package First;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.Modifier;
    
    public class Test {
        
        private int a;
        private String id;
        
        public static void main(String[] args) throws Exception {
            //1
            Class c = Class.forName("First.Test");  
            System.out.println(c);
            
            //2
            Class c2 = Test.class;
            System.out.println(c2);
            
            //3
            Test c3 = new Test();
            Class c4 = c3.getClass();
            System.out.println(c4);
            
        }
    }
    
    
    
     输出如下:
    class First.Test
    class First.Test
    class First.Test
    
    
    

      

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

     由此理解:为什么一个简单Java类必须存在一个无参构造方法


    三、获取属性
    (1)获取指定属性
    package First;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.Modifier;
    
    public class Test {
        
        private String id;
        
        public static void main(String[] args) throws Exception {
            
            //获取类  包名.类名
            Class c = Class.forName("First.Test");  
    
            //获取Test类的id属性
            Field fs = c.getDeclaredField("id");  
            
            //实例化这个类赋给o 
            Object o = c.newInstance(); 
            
            //打破封装,使能修改
            fs.setAccessible(true);
            
            //运行状态时,给o对象的id属性赋值"110" 
            fs.set(o, "110"); //set 
            
            System.out.println(fs.get(o)); 
        }
    }
    
    
    
    
    
    输出如下:
    110
    

      

    (2)获取所有属性

    package First;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.Modifier;
    
    public class Test {
        
        public static void main(String[] args) throws Exception {
            //获取Integer类
            Class c = Class.forName("java.lang.Integer");  
            
            //获取所有的属性  
            Field[] fs = c.getDeclaredFields();  
     
            //定义可变长的字符串,用来存储属性  
            StringBuffer sb = new StringBuffer();  
            
            //通过追加的方法,将每个属性拼接到此字符串中  
            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); 
        }
    }
    
    
    输出如下:
    public final class Integer{
    	public static final int MIN_VALUE;
    	public static final int MAX_VALUE;
    	public static final Class TYPE;
    	static final char[] digits;
    	static final char[] DigitTens;
    	static final char[] DigitOnes;
    	static final int[] sizeTable;
    	private final int value;
    	public static final int SIZE;
    	public static final int BYTES;
    	private static final long serialVersionUID;
    }
    

      

    四、Spring框架怎么用反射的?

    (1) 首先准备两个很简单的业务类




    (2) 非反射方式切换不同的业务方法调用


    当需要从第一个业务方法切换到第二个业务方法的时候,使用非反射方式,必须修改代码,并且重新编译运行,才可以达到效果

    (3)反射方式

    使用反射方式,首先准备一个配置文件,就叫做spring.txt吧, 放在src目录下。 里面存放的是类的名称,和要调用的方法名。
    在测试类Test中,首先取出类名称和方法名,然后通过反射去调用这个方法。

    当需要从调用第一个业务方法,切换到调用第二个业务方法的时候,不需要修改一行代码,也不需要重新编译,只需要修改配置文件spring.txt,再运行即可。

    配置文件里有class(类)和method(方法)

    下面实现了反射:

    使用这个例子,可以较好得理解反射的一个应用场景。

    这也是Spring框架的最基本的原理,只是它做的更丰富,安全,健壮。

    (我把大神的回答全COPY过来,是为了更好的理解)

     
     
     反射:
    比如:连接数据库的信息,写在配置文件,可以只修改配置文件,不修改代码,就能方便的更换连接的数据库:SqlServer、MySQL、Oracle等
    这也是通过反射,获取数据库配置文件的各个字段信息
     
     
     








  • 相关阅读:
    PuTTY 私钥'putty/sshdss.c' 多个信息泄露漏洞
    PuTTY DSA签名远程缓冲区溢出漏洞(CVE-2013-4207)
    Apache CloudStack多个跨站脚本漏洞(CVE-2013-2136)
    phpMyAdmin 完整路径泄露漏洞3
    程序员必知的 七 种软件架构模式!
    【扩展知识】数据结构之动态内存管理机制!
    新年新气象,拼多多退出春晚红包合作,由抖音补位!
    【新年第一个程序】三子棋小游戏(C语言数组实现)
    编程开发中你必须了解的内存知识!从分配到使用直至出现Bug!
    C语言小写转大写,小写字母转换成大写字母!
  • 原文地址:https://www.cnblogs.com/Donnnnnn/p/7729443.html
Copyright © 2011-2022 走看看