`

如何利用java反射机制获得private class与其它package中default class的实例

    博客分类:
  • java
阅读更多

本文链接:http://quentinXXZ.iteye.com/blog/2159052

 

   昨天,一个搞android安全方向的朋友让我帮忙试一下java的反射,要求就是:利用java反射机制获得private class与其它packagedefault 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[] {});
	}

}

 

本文链接:http://quentinXXZ.iteye.com/blog/2159052

分享到:
评论

相关推荐

    Java 高级特性.doc

    JAVA高级特性 1.静态导入:先举个离例子 。 import java.lang.Integer.parseInt; public class StaticImport { int x = parseInt("123"); System.out.println(x); } 这样的程序如果不在IDE 工具中输入,是很难...

    带注释的Bootstrap.java

    private static final Log log = LogFactory.getLog(Bootstrap.class); /** * Daemon object used by main. */ private static Bootstrap daemon = null; private static final File catalinaBaseFile; ...

    java经典面试2010集锦100题(不看你后悔)

    垃圾回收机制中,系统无法回收的是:(选择1项) A) 那些NULL对象 B) 当窗体显示的时候,指向窗体的对象。 C) 系统资源紧张的时候,一些垃圾资源 题目27:d 下列关于构造方法的说法中错误的是:(选择1项) A) ...

    java面试800题

    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...

    【04-面向对象(上)】

    •实例变量与实例共存亡;类变量与类本身共存亡。 局部变量的运行机制 •局部变量仅在方法内有效。 •当方法执行完成时,局部变量便会自动销毁。 封装 •理解封装:封装是面向对象的三大特征之一。 •...

    springmybatis

    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; // 部门负责...

    Hibernate注释大全收藏

    整个层次结构中的所有父类和子类属性都映射到同一个表中,他们的实例通过一个辨别符列(discriminator)来区分。 Plane 是父类。@DiscriminatorColumn 注解定义了辨别符列。对于继承层次结构中的每个类, @...

    zero ICE快速入门java版

    我们在该类中可以编写服务器端对请求的具体处理。 代码如下: package myHelloWorld.server; import Ice.Current; import myHelloWorld._HelloWorldDisp; public class HelloWorld_gaojs extends _...

    cms后台管理

    将解压后得到的jeecms-3.0.2-final文件夹下的root文件夹更名为jeecms拷贝到tomcat 安装目录下的webapps 文件夹下(例如: D:\Tomcat 6.0\webapps\),启动tomcat,在地址栏中输入http://localhost:8080/jeecms, 您...

Global site tag (gtag.js) - Google Analytics