您的位置:首页 > 其它

反射机制

2015-08-25 17:35 393 查看
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文件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: