本文链接:http://quentinXXZ.iteye.com/blog/2159052
昨天,一个搞android安全方向的朋友让我帮忙试一下java的反射,要求就是:利用java反射机制获得private class与其它package中default class的实例。这确实是一个比较奇葩的要求,估计也就是android这种平台加上是安全方向的,才常会有这样的需求。
不费话了,众所周知,利用java的反射机制,能做很多java本身限制以外的事情,比方说,获得一个实现的prviate属性或是调用其private的方法,这些都是通过正常使用反射都能实现的。然而标题中的要求,直接使用反射机制,试了很久,确实做不到(能做到的请吱声)。后来,我想的办法,是绕道实现。
比方说,public Class ReflectEntity的实例entiy中有属性为private Class PrivateClass的实例privateClass,我们就可以通过反射获得entiy实例中的privateClass,然后就可以再次通过反射操作privateClass的任何方法与属性。当然这种方法还是有个问题,你必须保证实例entiy实例中的privateClass已经实例化,不为null。
同理,你也可以获得不同package中的default class的实例。
说得差不多了,上代码。
package B:
/** * * @author quentinxxz * @version 2014-11-20 下午4:53:00 */ package B; public class ReflectEntity { private DefaultClass defaultClass = new DefaultClass(); private PrivateClass privateClass = new PrivateClass(); private void print() { defaultClass.print(); privateClass.print(); } private class PrivateClass { public void print() { System.out.println("this is a method in private class" ); } } }
/** * * @author quentinxxz.xu * @version 2014-11-20 下午5:10:51 */ package B; class DefaultClass { public void print() { System.out.println("this is a method in default class" ); } }
package A
package A; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import B.ReflectEntity; /** * * @author quentinxxz * @version 2014-11-20 下午4:50:00 */ public class TestReflect { /** * @param args * @throws SecurityException * @throws NoSuchMethodException * @throws IllegalAccessException * @throws InstantiationException * @throws NoSuchFieldException * @throws InvocationTargetException * @throws IllegalArgumentException * @throws ClassNotFoundException */ public static void main(String[] args) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, NoSuchFieldException, ClassNotFoundException, IllegalArgumentException, InvocationTargetException { ReflectEntity entity = new ReflectEntity(); Field fieldPrivate = entity.getClass().getDeclaredField("privateClass"); Field fieldDefault = entity.getClass().getDeclaredField("defaultClass"); fieldPrivate.setAccessible(true); fieldDefault.setAccessible(true); // System.out.println(fieldPrivate.get(entity).getClass().getDeclaredMethods()); // System.out.println(fieldDefault.get(entity).getClass().getDeclaredMethods()); Method[] methodsInPrivate = fieldPrivate.get(entity).getClass() .getDeclaredMethods(); Method[] methodsInDefault = fieldDefault.get(entity).getClass() .getDeclaredMethods(); Method methodInPrivate = methodsInPrivate[0]; methodInPrivate.setAccessible(true); Method methodInDefault = methodsInDefault[0]; methodInDefault.setAccessible(true); methodInPrivate.invoke(fieldPrivate.get(entity), new Object[] {}); methodInDefault.invoke(fieldDefault.get(entity), new Object[] {}); } }
相关推荐
JAVA高级特性 1.静态导入:先举个离例子 。 import java.lang.Integer.parseInt; public class StaticImport { int x = parseInt("123"); System.out.println(x); } 这样的程序如果不在IDE 工具中输入,是很难...
private static final Log log = LogFactory.getLog(Bootstrap.class); /** * Daemon object used by main. */ private static Bootstrap daemon = null; private static final File catalinaBaseFile; ...
垃圾回收机制中,系统无法回收的是:(选择1项) A) 那些NULL对象 B) 当窗体显示的时候,指向窗体的对象。 C) 系统资源紧张的时候,一些垃圾资源 题目27:d 下列关于构造方法的说法中错误的是:(选择1项) A) ...
do, double, else, extends, final, finally, float, for, goto, if, implements, import, instanceof, int, interface, long, native, new, package, private, protected, public, return, short, static, strictfp...
•实例变量与实例共存亡;类变量与类本身共存亡。 局部变量的运行机制 •局部变量仅在方法内有效。 •当方法执行完成时,局部变量便会自动销毁。 封装 •理解封装:封装是面向对象的三大特征之一。 •...
3. 建立与数据库对应的 java class,以及映射文件. 在src_user下建立package:com.yihaomen.mybatis.model ,并在这个 package 下建立 User 类: 程序代码 程序代码 package com.yihaomen.mybatis.model; public class...
public class SysUserGroup implements java.io.Serializable { private Integer id; private String remark; // 备注 private String name; // 部门名称 private String principal; // 部门负责...
整个层次结构中的所有父类和子类属性都映射到同一个表中,他们的实例通过一个辨别符列(discriminator)来区分。 Plane 是父类。@DiscriminatorColumn 注解定义了辨别符列。对于继承层次结构中的每个类, @...
我们在该类中可以编写服务器端对请求的具体处理。 代码如下: package myHelloWorld.server; import Ice.Current; import myHelloWorld._HelloWorldDisp; public class HelloWorld_gaojs extends _...
将解压后得到的jeecms-3.0.2-final文件夹下的root文件夹更名为jeecms拷贝到tomcat 安装目录下的webapps 文件夹下(例如: D:\Tomcat 6.0\webapps\),启动tomcat,在地址栏中输入http://localhost:8080/jeecms, 您...