本文链接: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深度历险:Chapter 05 - package与import机制 #### 前言 Java是一种广泛使用的编程语言,尤其适合于开发企业级应用。在Java编程的过程中,理解和掌握`package`与`import`机制至关重要。这两者是Java类加载...
Java中有四种访问级别:`public`、`protected`、`default`(即不写任何修饰符)和`private`。其中,`private`是最严格的访问控制,只允许在同一个类内部访问;而`public`则是最宽松的,可以从任何地方访问。 ### ...
### Android中利用App实现消息推送机制的代码实例 #### 消息推送机制 在移动互联网时代,消息推送已经成为了很多应用程序的重要组成部分。对于Android开发者来说,理解如何实现消息推送至关重要。消息推送机制允许...
在一个Java源文件中,**只能包含一个公共类**(`public class`),并且这个公共类的名称必须与源文件的名称完全一致。例如,如果源文件名为`Example.java`,那么该文件中可以包含一个名为`Example`的公共类。此外,...
### Java中的关键字大全 在Java编程语言中,关键字是一组预定义的词汇,它们具有特殊的含义和用途。理解和掌握这些关键字对于编写有效的Java程序至关重要。本文将详细介绍Java中的一些核心关键字,并提供相应的解释...
在Java中,类成员(如方法、变量)的可见性可以通过四种不同的访问修饰符来控制:`public`、`private`、`protected` 和 默认(也称为 `friendly` 或 `package-private`)。这四种修饰符决定了类成员可以在哪些范围内...
Struts2是一个基于MVC(Model-View-Controller)设计模式的Java web应用程序框架,它在Java社区中广泛应用于构建动态、数据驱动的Web应用。本实例将详细讲解如何使用Struts2实现一个简单的登录功能。 一、Struts2...
### Java关键字的用法 Java作为一种广泛使用的编程语言,拥有丰富的关键字来支持其核心功能与特性。本文将详细介绍部分重要的Java关键字及其用法。 #### 1. `abstract` `abstract`关键字用于定义抽象类或抽象方法...
static修饰符是java语言中的一种访问控制机制,它們可以用来修饰类、方法、变量等,以控制它们的实例共享性。 例如: public class Person { public static String name = "zhangsan"; public static void ...
在本文中,我们将详细介绍 Java 使用 InfluxDB 数据库的详细代码,包括如何在 Maven 项目中引入 InfluxDB 依赖项,编写 InfluxDB 工具类,连接 InfluxDB 数据库,创建保留策略等。 pom.xml 中引入 InfluxDB 依赖项 ...
Java提供了四种访问修饰符:`public`、`private`、`protected`和`default`,用于控制类、方法和变量的可见性。 ##### 6.7 构造方法 构造方法是一种特殊的方法,用于初始化对象。 ##### 6.8 封装 封装是指隐藏...
1. **定义一个类**:在Java中,使用`class`关键字来定义一个类。 ```java public class ClassName { // 类的属性 int id; String name; // 类的行为 void displayInfo() { System.out.println("ID: " + id ...
在Java中,类的组织是通过包(package)来实现的,包的主要目的是为了命名空间管理,避免类名冲突,并且提供了一种将相关类分组的方式。然而,不使用包名(即裸包)可能会导致以下问题: 1. **命名冲突**:如果没有...
Java中有四种访问权限控制符:`public`、`protected`、`private`和`default`。它们控制了类成员的可见性范围。 示例代码: ```java public class MyClass { private String privateField; // 私有字段 protected ...
Java.lang.reflect包下新增了AnnotatedElement接口,该接口代表程序中可以接受注解的程序元素,该接口主要有如下几个实现类:Class、Constructor、Field、Method、Package等。 AnnotatedElement接口是所有程序元素...
- “NULL”是 Java 中的一个特殊值,用于表示对象引用未指向任何对象实例,但它并不是一个关键字。 - “Native”可能是指 native 修饰符,用于标记本地方法,但正确拼写应为“native”。 ### 2. Java 语言诞生年份...
Struts2是一个强大的MVC(Model-View-Controller)框架,广泛应用于Java Web开发中,为开发者提供了构建可维护、可扩展的Web应用程序的结构。本实例将详细讲解如何使用Struts2实现一个简单的登录功能。 一、Struts2...
在Java中,类的访问控制主要有四种:public、protected、default(包私有)和private。包私有类(default access)意味着只有在同一包内的类才能访问该类,而其他包中的类则不能直接访问。当一个公共类扩展了包私有...
Java有四种权限修饰符:private(私有)、default(包访问权限)、protected(受保护)和public(公共)。它们决定了类、方法、属性的可见性,影响了代码的封装性和耦合度。 【构造器】 构造器用于初始化新对象,...