`
minzhenhua
  • 浏览: 5151 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

Java反射高级应用--利用反射调用类的私有方法修改私有方法值,以及替换Java的类成员数据 .

    博客分类:
  • java
 
阅读更多
package me.test;
import java.lang.reflect.*;  //导入反射需要的包
public class ReflectTest {
 public static void main(String[] args)  throws  Exception
 {  
  
  /*  下面通过反射完成对一个对象中成员的替换
   *   并且执行执行私有方法  
   *   完成对 Poiont类的对象中所有的 String的对象的d换成x
   *   并且类中无修改方法    
   */ 
    Point pt=new Point(3,5);  //创建一个Point对象
    Field fx=pt.getClass().getField("x") ;  //获取x的映射类对象
    Field fy=pt.getClass().getDeclaredField("y");//因为y是私有的所以要调用这个方法 
    Method m2=Point.class.getDeclaredMethod("showPrivate") ;//获得私有方法映射类  
    
    //利用反射调用共有输出 
    m2.setAccessible(true)  ;// 修改showPrivate 权限 改变为可以调用
       m2.invoke(pt) ;//执行私有方法
    //利用成员反射输出x 和 私有的 y  
    System.out.println(fx.getInt(pt));//反射输出x  
    fy.setAccessible(true) ;//改变私有为可访问
    System.out.println(fy.getInt(pt));//输出私有y
        
    //替换成员后并且反射私有方法输出 
    changeString(pt) ;//反射替换成员值
     System.out.println(pt);
    
    
 }
 public static void changeString(Object obj)  throws Exception//反射替换对所有String进行替换
 { 
  Field[] f=obj.getClass().getFields()  ; //获得成员映射数组
  for(Field tem : f)  //迭代for循环
  {
   if(tem.getType()==String.class)  //内存中只有一份String字节码 
   {
    String oldString=(String)tem.get(obj) ;  //返回内容
    String newString=oldString.replace('d', 'x');//将所有b替换为x  
    tem.setAccessible(true);
     tem.set(obj, newString) ;//替换成员值
   }
   
  }
  
 }


}



public class Point
{
 public int x  ;
 private int y  ;
 public Point(int x, int y) {
  super();
  this.x = x;
  this.y = y;
 }
   public String  a="dsfdsfd"  ;  //只有 共有可以替换
   public String  b="fdsfdsfewewwwww"  ;
   public String  c="adddssss"  ;

 private void showPrivate()  //私有方法输出
 {
  System.out.println("x="+this.x+"\n"+"y="+this.y);
  System.out.println(this.a);
  System.out.println(this.b);
  System.out.println(this.c); 
 }

 public String toString()
 {
  return this.a+"\n"+this.b+"\n"+this.c;
 }

}


 

分享到:
评论

相关推荐

    JAVA 反射机制应用

    - 避免反射调用敏感方法,如修改final字段或私有成员,除非明确知道这样做是安全的。 总之,Java反射机制为开发者提供了强大的工具,使得程序在运行时能够对自身进行深入的探索和操作。然而,使用时也需谨慎,权衡...

    Java开发技术大全(500个源代码).

    invokeMethod.java 利用反射机制调用成员方法 listConstructors.java 利用反射机制获取构造器列表 listFields.java 利用反射机制获取成员属性列表 listMethods.java 利用反射机制获取成员方法列表 loadClass....

    JAVA设计模式--程序设计--反射--注解--泛型

    通过反射,我们可以动态地创建对象、调用方法、访问和修改私有属性,实现动态加载类,以及进行元数据分析等。反射的应用场景广泛,如插件系统、框架设计、单元测试等。 注解(Annotation)是Java中的元数据,它为...

    java中的类反射机制

    Java作为一种高级编程语言,支持反射机制,这使得开发者能够在运行时动态地访问和操作类、接口以及它们的成员。Java中的反射主要包括以下几个方面: 1. **Class对象**:每个加载进JVM的类都有对应的`Class`对象,该...

    java主要反射和内存机制

    4. **字段访问**:可以使用`Field`类来获取和修改类的私有字段,`Field.get()`和`Field.set()`方法分别用于读取和设置字段值。 5. **注解处理**:反射还可以用来检查类、方法或字段上的注解,以实现动态元数据处理...

    基于java的开发源码-多线程反射泛型及正则表达式学习笔记和源码.zip

    源码可能包含使用反射创建对象、调用方法和访问私有成员的例子。 3. **泛型**:泛型是Java 5引入的新特性,用于提供类型安全,避免在运行时进行强制类型转换。泛型可以应用于类、接口和方法,通过类型参数来表示。...

    利用java反射创建通用的数据库查询方法.pdf

    Java反射机制是Java语言提供的一种强大的能力,允许程序在运行时动态地获取类的信息并调用其方法。在本示例中,`BaseDao` 类使用反射来创建一个通用的数据库查询方法,这可以极大地提高代码的复用性和灵活性。以下是...

    你不知道的JAVA高级应用

    3.动态代理 在调用这个目标方法前,后,2头,异常处都可以动态的加上自己需要逻辑判断,而且根据反射来动态的替换实现类,大大提升了程序的灵活性 4.拆箱装箱的中的项元模式,当该对象在一个字节内时 -128~~127 的时候 用...

    MediaController反射修改

    3. **反射调用私有方法和字段**:通过反射,可以调用私有构造函数、方法和访问私有字段,如`setAccessible(true)`可以使私有成员可访问。 4. **修改UI元素**:可能需要修改`MediaController`中的UI元素,例如改变...

    dwr与反射相结合案例

    通过反射,我们可以在运行时动态地创建对象、调用方法、访问字段,甚至修改私有成员。在DWR与反射的结合中,我们可以利用反射来实现一些特定的需求,例如: 1. **动态对象映射**:如果我们的应用需要处理未知类型的...

    PatchLib,告别Java反射!.zip

    在Java的开发过程中,反射经常用于动态加载类、创建对象、访问私有成员以及调用非公开方法等场景。然而,这种能力伴随着潜在的风险:反射操作比直接方法调用慢,因为它需要在运行时解析类信息;此外,反射可以绕过...

    java 利用java反射机制动态加载类的简单实现

    以下是关于Java反射机制的详细解释以及代码分析: 1. **Java反射机制**:Java反射API包含在`java.lang.reflect`包中,主要类有`Class`、`Constructor`、`Method`和`Field`等。它们分别用于获取类的信息、构造器信息...

    java反射与泛型综合例子

    反射还可以用于访问私有成员,修改字段值,甚至调用私有方法。 接下来,我们来看Java泛型,它是从Java 5开始引入的一个特性,目的是提高代码的类型安全性和可读性。泛型允许我们在定义类、接口和方法时指定类型参数...

    Java在利用反射条件下替换英文字母中的值

    本文将详细讲解如何在反射条件下替换Java对象中字符串的英文字母值。 首先,我们需要了解Java反射的基本概念。反射是Java提供的一种机制,允许程序在运行时动态地获取类的信息(如类名、属性、方法等)并调用它们。...

    基于Java的源码-多线程反射泛型及正则表达式学习笔记和源码.zip

    通过Class类,我们可以动态加载类,创建对象,调用方法,访问和修改私有属性。反射在许多场景下都很有用,如插件系统、序列化、动态代理等。 3. **泛型** 泛型是Java 5引入的新特性,它增强了代码的类型安全性和...

    java-内存-方法区介绍

    方法区(Method Area),又被称为永久代(PermGen),是Java虚拟机(JVM)的一部分,主要负责存储类的元数据信息,包括但不限于类的class字节码信息、静态与非静态方法、静态成员变量、常量以及字符串常量池等。...

    commons-lang3-3.12.0.jar

    此外,`FieldUtils`和`MethodUtils`则提供了对字段和方法的反射操作,包括访问私有成员、设置和获取字段值、调用方法等。 五、异常处理 `ExceptionUtils`提供了处理和封装异常的工具,如获取堆栈跟踪信息、捕获特定...

    Java高级编程核心内容讲解大全

    通过反射,我们可以创建未知类型的对象,调用私有方法,修改私有字段,实现动态代理等。侯捷的讲解通常深入浅出,对理解反射有极大帮助。 四、内存管理 Java的垃圾回收机制(GC)简化了内存管理,但理解如何有效...

Global site tag (gtag.js) - Google Analytics