java 反射机制

Posted rxl007

tags:

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

    class Type{  
        public int pubIntField;  
        public String pubStringField;  
        private int prvIntField;  
           
        public Type(){  
            Log("Default Constructor");  
        }  
           
        Type(int arg1, String arg2){  
            pubIntField = arg1;  
            pubStringField = arg2;  
               
            Log("Constructor with parameters");  
        }  
           
        public void setIntField(int val) {  
            this.prvIntField = val;  
        }  
        public int getIntField() {  
            return prvIntField;  
        }  
           
        private void Log(String msg){  
            System.out.println("Type:" + msg);  
        }  
    }  
       
    class ExtendType extends Type{  
        public int pubIntExtendField;  
        public String pubStringExtendField;  
        private int prvIntExtendField;  
           
        public ExtendType(){  
            Log("Default Constructor");  
        }     
           
        ExtendType(int arg1, String arg2){        
            pubIntExtendField = arg1;  
            pubStringExtendField = arg2;  
               
            Log("Constructor with parameters");  
        }  
           
        public void setIntExtendField(int field7) {  
            this.prvIntExtendField = field7;  
        }  
        public int getIntExtendField() {  
            return prvIntExtendField;  
        }  
           
        private void Log(String msg){  
            System.out.println("ExtendType:" + msg);  
        }  
    }  

1、获取类的Class对象

调用getClass

Boolean var1 = true;

Class<?> classType2 = var1.getClass();

System.out.println(classType2);

输出:class java.lang.Boolean

运用.class 语法

Class<?> classType4 = Boolean.class;

System.out.println(classType4);

输出:class java.lang.Boolean

运用static method Class.forName()

Class<?> classType5 = Class.forName("java.lang.Boolean");

System.out.println(classType5);

输出:class java.lang.Boolean

运用primitive wrapper classes的TYPE 语法

这里返回的是原生类型,和Boolean.class返回的不同

Class<?> classType3 = Boolean.TYPE;

System.out.println(classType3);        

输出:boolean

 

2、获取类的Fields

public Field getField(String name) 返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段
public Field[] getFields() 返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段
public FieldgetDeclaredField(Stringname) 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段
public Field[] getDeclaredFields() 返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段

可见getFields和getDeclaredFields区别:

getFields返回的是申明为public的属性,包括父类中定义,

getDeclaredFields返回的是指定类定义的所有定义的属性,不包括父类的。

 

3、获取类的Method

 

通过反射机制得到某个类的某个方法,然后调用对应于这个类的某个实例的该方法

 

Class<T>类提供了几个方法获取类的方法。

public Methodget Method(String name,Class<?>... parameterTypes)

返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法

public Method[] getMethods() 返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法
public Method getDeclaredMethod(Stringname,Class<?>... parameterTypes) 返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法
public Method[] getDeclaredMethods()

返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法

 

以上是关于java 反射机制的主要内容,如果未能解决你的问题,请参考以下文章

反射机制入门

反射机制入门

java 反射代码片段

深入理解java的反射机制

Java反射机制

Java核心技术梳理-类加载机制与反射