您的位置:首页 > 编程语言 > Java开发

Java反射机制原理及使用(二)

2014-10-20 00:17 267 查看
1.获取字节码文件中的字段:

(1)获取公共字段,使用Class中的getField()方法。

注:将Person类中的age访问权限改为public:

public static void getPublicFieldDemo() throws Exception{
String className = "Person";
Class clazz = Class.forName(className);
Field field = null;
field = clazz.getField("age");
Object obj = clazz.newInstance();
Object o = field.get(obj);
System.out.println(o);
}
结果:
---------- java ----------
Person run
0
Output completed (0 sec consumed) - Normal Termination


若age访问权限为private,则会报访问异常:

---------- java ----------
Exception in thread "main" java.lang.NoSuchFieldException: age
at java.lang.Class.getField(Class.java:1690)
at ReflectDemo.getPublicFieldDemo(ReflectDemo.java:20)
at ReflectDemo.main(ReflectDemo.java:12)
Output completed (0 sec consumed) - Normal Termination


(2)获取本类中的所有字段,使用Class中的getDeclaredField()方法。

注意:由于访问权限问题,访问超限时需要对相应字段的访问取消权限检查。即:使用暴力访问方式。

public static void getPrivateFieldDemo() throws Exception{
String className = "Person";
Class clazz = Class.forName(className);
Field field = null;
field = clazz.getDeclaredField("age");
field.setAccessible(true);
Object obj = clazz.newInstance();
Object o = field.get(obj);
System.out.println(o);
}
//结果:此时的age问私有数据。
---------- java ----------
Person run
0
Output completed (0 sec consumed) - Normal Termination


2.获取字节码文件中的方法:

(1)获取字节码文件中的所有公共方法:

使用Class类中的成员方法getMethods();
public static void getPublicMethods() throws Exception{
String className = "Person";
Class clazz = Class.forName(className);
Method[] methods = clazz.getMethods();
for(Method method:methods){
System.out.println(method);
}
}
//结果:
---------- java ----------
public void Person.set(java.lang.String,int)
public void Person.show()
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()

Output completed (0 sec consumed) - Normal Termination


(2)获取字节码文件本类中的所有方法:(不包含继承来的方法)

仅需将上面的代码中getMethods()方法改成getDeclaredMethods方法即可!

(3)获取字节码文件中的指定方法:

public static void getSomeMethods() throws Exception{
String className = "Person";
Class clazz = Class.forName(className);
Constructor  constructor = clazz.getConstructor(String.class,int.class);
Object obj = constructor.newInstance("小米",50);

Method method = clazz.getMethod("show",null);	//需要注意,该方法仅能获取公共方法,获取非公共的方法需要使用getDeclaredMethod。
method.invoke(obj,null);
}
//结果:
---------- java ----------
Person run +  name ::小米 age :50
Person name :小米 age :50
Output completed (0 sec consumed) - Normal Termination


(3)获取字节码文件中的指定方法:(带参非公有)

注:show在Person类中为private修饰并含有两个参数的方法,其定义代码为:
private void show(String name1,String name2){
System.out.println("Person name :"+name1 +" name2 :"+name2);
}


获取它的代码为:

public static void getprivateMethods() throws Exception{
String className = "Person";
Class clazz = Class.forName(className);
Constructor  constructor = clazz.getConstructor(String.class,int.class);
Object obj = constructor.newInstance("小米",50);

Method method = clazz.getDeclaredMethod("show",String.class,String.class);
method.setAccessible(true);
method.invoke(obj,"小强","小米");
}
//结果为:
---------- java ----------
Person run +  name ::小米 age :50
Person name :小强 name2 :小米

Output completed (0 sec consumed) - Normal Termination
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: