Java反射机制原理及使用(二)
2014-10-20 00:17
281 查看
1.获取字节码文件中的字段:
(1)获取公共字段,使用Class中的getField()方法。
注:将Person类中的age访问权限改为public:
若age访问权限为private,则会报访问异常:
(2)获取本类中的所有字段,使用Class中的getDeclaredField()方法。
注意:由于访问权限问题,访问超限时需要对相应字段的访问取消权限检查。即:使用暴力访问方式。
2.获取字节码文件中的方法:
(1)获取字节码文件中的所有公共方法:
使用Class类中的成员方法getMethods();
(2)获取字节码文件本类中的所有方法:(不包含继承来的方法)
仅需将上面的代码中getMethods()方法改成getDeclaredMethods方法即可!
(3)获取字节码文件中的指定方法:
(3)获取字节码文件中的指定方法:(带参非公有)
注:show在Person类中为private修饰并含有两个参数的方法,其定义代码为:
获取它的代码为:
(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
相关文章推荐
- 使用java反射机制来模拟hibernate session的实现原理
- Java反射机制的原理与简单使用
- 使用java反射机制来模拟hibernate session的实现原理
- java反射机制的原理与简单使用
- Java反射机制原理及使用(一)
- Java反射机制的原理与使用(反编译)
- Java反射机制的原理与简单使用
- Java NIO原理和使用
- ASP.NET SESSION的使用及原理 (补充)
- va_start va_arg va_end 的使用和原理
- .net 中viewstate的原理和使用
- Java NIO原理和使用
- ASP.NET SESSION的使用及原理 (补充)
- AWT使用ImageProducer/ImagConsumer模式加载和显示图像的原理(转)
- asp+中的session 的使用和原理() 不需要cookie也可以使用session
- 动态加载类的原理——元数据的使用
- 动态加载类的原理——元数据的使用
- Java NIO原理和使用