Java反射(一眼就看会)

Posted 王晓东

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java反射(一眼就看会)相关的知识,希望对你有一定的参考价值。

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();

 


三、获取属性
(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() +"{\n");  
        
        //遍历里边的每一个属性  
        for(Field field:fs){  
            sb.append("\t");//空格  
            sb.append(Modifier.toString(field.getModifiers())+" ");//获得属性的修饰符,例如public,static等等  
            sb.append(field.getType().getSimpleName() + " ");//属性的类型的名字  
            sb.append(field.getName()+";\n");//属性的名字+回车  
        }  

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

  







参考:
http://blog.csdn.net/liujiahan629629/article/details/18013523



























以上是关于Java反射(一眼就看会)的主要内容,如果未能解决你的问题,请参考以下文章

Java 虚拟机原理Java 反射原理 ( 反射作用 | 反射用法 )

Java Reflection (JAVA反射)机制详解

JAVA反射Field

反射机制在java中如何做呀?

如何利用java的反射机制动态创建对象

说说对java反射的理解,使用反射如何获取一个类的所有方法,使用反射需要注意哪些问题?