反射机制

package jia;
 import java.lang.reflect.Array;     
import java.lang.reflect.Constructor;     
import java.lang.reflect.Field;     
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;     
    
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);  
    }  

public class Reflection
{
public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException
{
System.out.println("a");
Class classType = ExtendType.class;            
// 使用getFields获取属性  
Field[] fields = classType.getFields();  
for (Field f : fields)  
{  
   System.out.println(f);  

}  

输出

public int jia.ExtendType.pubIntExtendField

public java.lang.String jia.ExtendType.pubStringExtendField
public int jia.Type.pubIntField
public java.lang.String jia.Type.pubStringField
  

System.out.println();                 
// 使用getDeclaredFields获取属性  
fields = classType.getDeclaredFields();  
for (Field f : fields)  
{  
   System.out.println(f);  

}  

输出

public int jia.ExtendType.pubIntExtendField
public java.lang.String jia.ExtendType.pubStringExtendField
private int jia.ExtendType.prvIntExtendField

可见getFields和getDeclaredFields区别:

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

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


System.out.println("方法");
classType = ExtendType.class;  
Method[] methods = classType.getMethods();  
for (Method m : methods)  
{  
   System.out.println(m);  

}  

public void jia.ExtendType.setIntExtendField(int)
public int jia.ExtendType.getIntExtendField()
public void jia.Type.setIntField(int)
public int jia.Type.getIntField()
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()

  
System.out.println();  
  
// 使用getDeclaredMethods获取函数   
methods = classType.getDeclaredMethods();  
for (Method m : methods)  
{  
   System.out.println(m);  

}

输出

public void jia.ExtendType.setIntExtendField(int)
public int jia.ExtendType.getIntExtendField()
private void jia.ExtendType.Log(java.lang.String)


System.out.println("构造方法");
Constructor<?>[] constructors = classType.getConstructors();  
for (Constructor<?> m : constructors)  
{  
   System.out.println(m);  

输出

public jia.ExtendType()                

System.out.println();                 
// 使用getDeclaredConstructors获取构造器     
constructors = classType.getDeclaredConstructors();  
for (Constructor<?> m : constructors)  
{  
   System.out.println(m);  

}  

输出

public jia.ExtendType()
jia.ExtendType(int,java.lang.String


System.out.println("调用函数");
   classType = ExtendType.class;  
Object inst = classType.newInstance();  
Method logMethod = classType.getDeclaredMethod("Log", String.class); 
logMethod.setAccessible(true);
logMethod.invoke(inst, "test"); 

System.out.println("设置属性");
classType = ExtendType.class;  
Object inst1 = classType.newInstance();  
Field intField = classType.getField("pubIntExtendField");  
intField.setInt(inst1, 100);  
int value = intField.getInt(inst1); 
System.out.println(value);
}

}

RTTi和反射之间的区别:

对应RTTI来说,编译器在编译时打开和检查.class文件,对于反射机制来说,.class文件在编译时时不可获取的,所以是在运行时打开和检查.class文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值