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;
 }

}

 

时间: 2025-01-21 08:11:47

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

java怎样可以做到利用JNI调用C++类,而不是C++方法?

问题描述 网上搜的介绍几本都通过JNI是java调用C/C++方法的,是否可以用java调用C/C++类呢?因为我底层接口是写的C++类,类中声明了好多变量,这些变量在类中好多方法中要被使用或赋值,相当于全局变量. 解决方案 解决方案二:基本上:无简易方法.如果你需要C++程序处理一个特定的复杂事物,可以考虑将C++写成纯命令行程序,然后Java用Runtime去执行,也就是进程方式.解决方案三:你觉得这样行不行,我在这个类之上再写个方法,在这个方法内调用类.但是这个方法我要多次调用,并且前一次

java中利用反射调用另一类的private方法的简单实例_java

我们知道,Java应用程序不能访问持久化类的private方法,但Hibernate没有这个限制,它能够访问各种级别的方法,如private, default, protected, public. Hibernate是如何实现该功能的呢?答案是利用JAVA的反射机制,如下:  import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class ReflectDemo

利用反射动态调用类成员

动态 (C#)利用反射动态调用类成员 使用反射动态调用类成员,需要Type类的一个方法:InvokeMember.对该方法的声明如下(摘抄于MSDN): public object InvokeMember( string name, BindingFlags invokeAttr, Binder binder, object target, object[] args ); 参数 name String,它包含要调用的构造函数.方法.属性或字段成员的名称. - 或 - 空字符串 (""

(C#)利用反射动态调用类成员

动态 (C#)利用反射动态调用类成员 使用反射动态调用类成员,需要Type类的一个方法:InvokeMember.对该方法的声明如下(摘抄于MSDN): public object InvokeMember( string name, BindingFlags invokeAttr, Binder binder, object target, object[] args ); 参数 name String,它包含要调用的构造函数.方法.属性或字段成员的名称. - 或 - 空字符串 (""

反射 注解-Java利用反射执行框架注入类的非静态方法

问题描述 Java利用反射执行框架注入类的非静态方法 之前对代码做优化,利用了反射去执行指定类的指定方法: public static JsonResultVO callMethod(Class<?> className String methodName Class<?>[] paramClass Object[] param) { JsonResultVO resultVO = new JsonResultVO(); try { Method m = className.get

Java中利用反射实现类的动态加载

//首先定义一个接口来隔离类: public interface Operator { // public java.util.List act(java.util.List params); public java.util.List act(String content,String content2,java.util.List params); } 根据设计模式的原理,我们可以为不同的功能编写不同的类,每个类都继承Operator接口,客户端只需要针对Operator接口编程就可以避免很

Java高级特性之反射学习总结

老规矩我们还是先提出几个问题,一门技术必然要能解决一定的问题,才有去学习掌握它的价值 一. 什么是反射? 二.反射能做什么? 一. 什么是反射? 用在Java身上指的是我们可以于运行时加载.探知.使用编译期间完全未知的classes.换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体.或对其fields设值.或唤起其methods. 如果你是一个Android Developer,前辈们都会教导你尽量少用反射,效率太低,

Java范型深入理解,利用反射穿透编译器忽略范型

Java中的范型的作用阶段是在 编译时,也就是说范型是给编译器看的    . 我们经常看到  类 ArrayList<E>      后面的<E>  就是类型化参数,说明这个 ArrayList支持  范型化   . 比如   ArrayList<Integer>    就叫做Integer类型化的ArrayList.,当编译完之后 在运行阶段 就会丢掉 类型化参数   .    范型化后的 类型  与原始类型之间的操作:  Collection c=new Vecto

利用反射,实现动态调用winform窗体!!

动态 实用前提:在WinForm程序中,通过主窗体的Menu打开不同的窗体我以前的做法:在Menu的Click事件中,创建打开窗体的对象实例这样的缺点,我不说了:)看看利用反射动态调用窗体对象的方法:private void CreateForm(string strName){ this.Cursor = Cursors.WaitCursor; string path=AssemblyName;//项目的Assembly选项名称 string name=strName; //类的名字 Form