java 反射动态代理相关的问题

王能 2018-03-07 05:05:17
大致代码如下,要求是:在不动View类的情况下,修改掉getData的返回值,不限制手段


public static void main(String[] args) {
View a = new View();//很多地方都用到
int i = a.getData();//很多地方都用到
//各位大神,怎么用反射或其他方法来修改这个返回值
}

public class View {//系统api,很多代码都有用到

public int getData() {
return Utils.staticUtils.getData();//View类和Utils类同一包下
}
}

public class Utils {//系统api,没有父类
static Utils staticUtils = new Utils();//单例

private Utils2 mUtils2 = new Utils2();//私有

int getData() {
return mUtils2.getData();
}
}

public final class Utils2 {//系统api,已经是final了,没有父类

public int getData() {
return 1;
}
}
...全文
457 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
piaoatt 2018-03-18
  • 打赏
  • 举报
回复
不动view类,那动Utils类呗
王能 2018-03-13
  • 打赏
  • 举报
回复
这是安卓项目里面的,项目要求:批量修改颜色.如果一个个改太麻烦了,所以想改安卓系统的api,但是这个api也太操蛋了,不是final就Default,private
maradona1984 2018-03-08
  • 打赏
  • 举报
回复
引用 3 楼 pilnyun335857183 的回复:
[quote=引用 2 楼 maradona1984 的回复:] public static void main(String[] args) { View a = new View();//很多地方都用到 int i = a.getData();//很多地方都用到 //各位大神,怎么用反射或其他方法来修改这个返回值 } 如果这样调用,没办法做到的 spring的AOP也是由于所有的bean都是spring管理,他提供了做AOP的钩子,你这个对象是自己new创建的,如果不修改现有代码是无法做到的 我想知道为什么不能改view这个类的代码
aspectj可以在编译时织入的添加maven配置 <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>aspectj-maven-plugin</artifactId> <version>1.4</version> <executions> <execution> <goals> <goal>compile</goal> <goal>test-compile</goal> </goals> </execution> </executions> <configuration> <source>${maven.compiler.source}</source> <target>${maven.compiler.target}</target> </configuration> </plugin> 通过在编译时修改View的字节码,相当于改View的代码但是是在编译时实现[/quote] 学习了,但这个和改代码区别不大,不知道他为啥不能改代码
pilnyun335857183 2018-03-07
  • 打赏
  • 举报
回复
另外spring集成aspectj只不过是使用了aspectj的语法,各种注解而已,最终还是会转化为spring的经典aop语法是运行时织入的; 有兴趣可以深入看下spring如何集成aspectj 建议从AopConfigUtils#registerAspectJAnnotationAutoProxyCreatorIfNecessary方法开始
pilnyun335857183 2018-03-07
  • 打赏
  • 举报
回复
引用 2 楼 maradona1984 的回复:
public static void main(String[] args) { View a = new View();//很多地方都用到 int i = a.getData();//很多地方都用到 //各位大神,怎么用反射或其他方法来修改这个返回值 } 如果这样调用,没办法做到的 spring的AOP也是由于所有的bean都是spring管理,他提供了做AOP的钩子,你这个对象是自己new创建的,如果不修改现有代码是无法做到的 我想知道为什么不能改view这个类的代码
aspectj可以在编译时织入的添加maven配置 <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>aspectj-maven-plugin</artifactId> <version>1.4</version> <executions> <execution> <goals> <goal>compile</goal> <goal>test-compile</goal> </goals> </execution> </executions> <configuration> <source>${maven.compiler.source}</source> <target>${maven.compiler.target}</target> </configuration> </plugin> 通过在编译时修改View的字节码,相当于改View的代码但是是在编译时实现
maradona1984 2018-03-07
  • 打赏
  • 举报
回复
public static void main(String[] args) { View a = new View();//很多地方都用到 int i = a.getData();//很多地方都用到 //各位大神,怎么用反射或其他方法来修改这个返回值 } 如果这样调用,没办法做到的 spring的AOP也是由于所有的bean都是spring管理,他提供了做AOP的钩子,你这个对象是自己new创建的,如果不修改现有代码是无法做到的 我想知道为什么不能改view这个类的代码
pilnyun335857183 2018-03-07
  • 打赏
  • 举报
回复
用aspectj的around可以做到啊,大致像下面的代码 @Aspect public class ViewInterceptor { @Around("execution(* a.b.c.View.getData())") public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { // 执行原方法的逻辑 // Object proceed = proceedingJoinPoint.proceed(); // 想要的返回值 Object result = new Object(); return result; } }

51,397

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧