`

如何利用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深度历险\CH_05.package与import机制

    ### Java深度历险:Chapter 05 - package与import机制 #### 前言 Java是一种广泛使用的编程语言,尤其适合于开发企业级应用。在Java编程的过程中,理解和掌握`package`与`import`机制至关重要。这两者是Java类加载...

    Thinking in Java TXT 电子书

    本书中提到的具体代码示例,如使用`ArrayList`类创建实例,体现了如何利用Java标准库简化开发流程。下面是一段简化的代码示例,展示了如何创建和使用`ArrayList`: ```java import java.util.ArrayList; public ...

    JAVA上课笔记class_03

    Java中有四种访问级别:`public`、`protected`、`default`(即不写任何修饰符)和`private`。其中,`private`是最严格的访问控制,只允许在同一个类内部访问;而`public`则是最宽松的,可以从任何地方访问。 ### ...

    Android中利用App实现消息推送机制的代码实例

    ### Android中利用App实现消息推送机制的代码实例 #### 消息推送机制 在移动互联网时代,消息推送已经成为了很多应用程序的重要组成部分。对于Android开发者来说,理解如何实现消息推送至关重要。消息推送机制允许...

    java类的应用

    在一个Java源文件中,**只能包含一个公共类**(`public class`),并且这个公共类的名称必须与源文件的名称完全一致。例如,如果源文件名为`Example.java`,那么该文件中可以包含一个名为`Example`的公共类。此外,...

    java中的关键字大全

    ### Java中的关键字大全 在Java编程语言中,关键字是一组预定义的词汇,它们具有特殊的含义和用途。理解和掌握这些关键字对于编写有效的Java程序至关重要。本文将详细介绍Java中的一些核心关键字,并提供相应的解释...

    Java常见面试题集--面试题全面综合.pdf

    在Java中,类成员(如方法、变量)的可见性可以通过四种不同的访问修饰符来控制:`public`、`private`、`protected` 和 默认(也称为 `friendly` 或 `package-private`)。这四种修饰符决定了类成员可以在哪些范围内...

    struts2登录实例

    Struts2是一个基于MVC(Model-View-Controller)设计模式的Java web应用程序框架,它在Java社区中广泛应用于构建动态、数据驱动的Web应用。本实例将详细讲解如何使用Struts2实现一个简单的登录功能。 一、Struts2...

    Java关键字的用法

    ### Java关键字的用法 Java作为一种广泛使用的编程语言,拥有丰富的关键字来支持其核心功能与特性。本文将详细介绍部分重要的Java关键字及其用法。 #### 1. `abstract` `abstract`关键字用于定义抽象类或抽象方法...

    java修饰符

    static修饰符是java语言中的一种访问控制机制,它們可以用来修饰类、方法、变量等,以控制它们的实例共享性。 例如: public class Person { public static String name = "zhangsan"; public static void ...

    java使用influxDB数据库的详细代码

    在本文中,我们将详细介绍 Java 使用 InfluxDB 数据库的详细代码,包括如何在 Maven 项目中引入 InfluxDB 依赖项,编写 InfluxDB 工具类,连接 InfluxDB 数据库,创建保留策略等。 pom.xml 中引入 InfluxDB 依赖项 ...

    java笔记 java笔记

    Java提供了四种访问修饰符:`public`、`private`、`protected`和`default`,用于控制类、方法和变量的可见性。 ##### 6.7 构造方法 构造方法是一种特殊的方法,用于初始化对象。 ##### 6.8 封装 封装是指隐藏...

    java初级oop基础

    1. **定义一个类**:在Java中,使用`class`关键字来定义一个类。 ```java public class ClassName { // 类的属性 int id; String name; // 类的行为 void displayInfo() { System.out.println("ID: " + id ...

    java-对比操作前后不同-裸包

    在Java中,类的组织是通过包(package)来实现的,包的主要目的是为了命名空间管理,避免类名冲突,并且提供了一种将相关类分组的方式。然而,不使用包名(即裸包)可能会导致以下问题: 1. **命名冲突**:如果没有...

    java面向对象

    Java中有四种访问权限控制符:`public`、`protected`、`private`和`default`。它们控制了类成员的可见性范围。 示例代码: ```java public class MyClass { private String privateField; // 私有字段 protected ...

    Java注解处理器简单实例

    Java.lang.reflect包下新增了AnnotatedElement接口,该接口代表程序中可以接受注解的程序元素,该接口主要有如下几个实现类:Class、Constructor、Field、Method、Package等。 AnnotatedElement接口是所有程序元素...

    java基础知识测试题

    - “NULL”是 Java 中的一个特殊值,用于表示对象引用未指向任何对象实例,但它并不是一个关键字。 - “Native”可能是指 native 修饰符,用于标记本地方法,但正确拼写应为“native”。 ### 2. Java 语言诞生年份...

    struts2 实现登录实例

    Struts2是一个强大的MVC(Model-View-Controller)框架,广泛应用于Java Web开发中,为开发者提供了构建可维护、可扩展的Web应用程序的结构。本实例将详细讲解如何使用Struts2实现一个简单的登录功能。 一、Struts2...

    mockito-package-private-class:Mockito 无法在扩展包私有类的公共类上创建模拟..

    在Java中,类的访问控制主要有四种:public、protected、default(包私有)和private。包私有类(default access)意味着只有在同一包内的类才能访问该类,而其他包中的类则不能直接访问。当一个公共类扩展了包私有...

Global site tag (gtag.js) - Google Analytics