0 0

java反射改变方法的返回值0

java能在运行期间通过反射去改变方法的返回值么?
 
2014年5月25日 02:28

8个答案 按时间排序 按投票排序

0 0

采纳的答案

如果这个值是类属性应该是可以改变的 因为反射是可以改变类属性的值 如果这个值是局部变量那应该是改变不了的
下面的是通过改变类属性来间接改变方法的返回值

public static void main(String[] args) throws Exception{
User u=new User();
u.setName("HH");
Class cla=User.class;
Method m=cla.getMethod("setName", String.class);
m.invoke(u, "美女");

Method md=cla.getDeclaredMethod("getName",null);

Object t=md.invoke(u, null);
System.out.println(t);

}

2014年5月25日 03:28
0 0

package com.ljn.base;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author lijinnan
 * @date:2014-5-26
 */
public class ChangeReturnValue {

    /**
     * @param args
     */
    public static void main(String[] args) {

        IOrder order = new Order(1);
        System.out.println(order.getPrice());
        IOrder proxyOrder = ProxyOrder.getProxyOrder(order);
        System.out.println(proxyOrder.getPrice());
    }

    static class ProxyOrder  {

        
        public static IOrder getProxyOrder(final IOrder order) {  
            IOrder iOrder = (IOrder) Proxy.newProxyInstance(order.getClass().getClassLoader(),  
                                                              order.getClass().getInterfaces(),  
                                                              
                                                              new InvocationHandler (){
                @Override
                public Object invoke(Object proxy, Method method, Object[] args)
                        throws Throwable {
                    
                            if (method.getName().equals("getPrice")) {
                                return 2;
                            }
                            return method.invoke(order, args);
                }
            });  
           return iOrder;  
        } 
        
        
    }
    
    static interface IOrder {
        
        int getPrice();
        
    }
    
    static class Order implements IOrder {
        
        private int price;
        
        public Order(int price) {
            this.price = price;
        }
        
        @Override
        public int getPrice() {
            return price;
        }
        
    }
   
}

2014年5月26日 15:01
0 0

可以通过动态代理来实现:

class DynamicProxy implements InvocationHandler{  

       public Object invoke(Object obj, Method method, Object[] aobj) throws Throwable {  
 //在这里改变返回值
    }
}

2014年5月26日 14:38
0 0

返回类型不可以改变。要改变返回值话,如果返回的值可以通过改变对象的状态(代码执行的外部环境,或者对象的成员变量值)的话,如public int a(){return this.a;},直接改变状态即可。
如果不可以通过改变状态来改变,如public int a(){return 1;}只能通过其它办法来做,比如代理或拦截的方式来做。

2014年5月26日 11:56
0 0

Java的反射机制个人理解,就是相当于通过代码的方式去动态改变一个对象的成员属性等,可能有点绕。

在Java代码中 一般我们可以实现实现一个对象的新建:

A a = new A();
a.setXXXX('asdf');

对于属性XXXX 是这样进行赋值的,那倘若,我们将成员的属性与对应的属性值通过配置的方式进行存储,如:
XXXX:public
YYYY:public2

那么我们对于这样一个对象的创建,赋值那就必须自己编写好多的if else 来操作,如:

if('XXXX'.equals("method")){
a.setXXXX('public');
}

if('YYYY'.equals('method')){
a.setYYYY('public2');
}

但是如果通过反射来实现的话,效果可以同样处理,但是实现起来就相对比较简单了

A a = Class.forName(A.class).netInstance();
field.setvalue(a,'XXXX'); 

这样就可以实现赋值操作,其中field 是从class A中获取出来的 DeclaredField对象


以上纯属个人理解,如有不正之处 还望多多意见

2014年5月25日 16:15
0 0

可以了解一下SPRING的AOP就知道可以在运行时去改变方法的返回值了。

2014年5月25日 11:42
0 0

楼主,要实现改变方法的返回值,比如有一个方法

XX getXX() {
 return XX;
}

这个时候,通过反射可以把这个XX的值改变了,实现改变返回值的效果。同时,如果你的代码是封闭成MBean的话,也可以通过JConsole,JMX远程连接改变这个MBean中的属性值,实现改变返加值的目的。

2014年5月25日 10:23
0 0

运行期间改变只能是反射了,

其实你也可以考虑
继承该类通过其他方式改变返回类型

如
public <X> X get(String property) {
  if (allowNestedValues && NestedModelUtil.isNestedProperty(property)) {
    return (X)NestedModelUtil.getNestedValue(this, property);
  }
  return map == null ? null : (X) map.get(property);
}


public Date getExpiredate() {
    return  get("expiredate");
}

public String getSubject() {
    return  get("subject");
}

2014年5月25日 07:48

相关推荐

    图解java反射机制及常用应用场景_字母哥博客

    反射机制可以让我们在运行期动态地调用方法,并传递参数和返回值。 3.6 创建类的对象(实例化对象) 反射机制可以让我们在运行期动态地创建类的对象,并使用这些对象来执行不同的操作。 四、反射机制的优缺点 ...

    java.反射机制与动态代理(处理方案示例).md

    Java反射机制和动态代理是Java语言中非常强大的特性,它们广泛应用于各种框架和库中,允许开发者在运行时检查和修改程序的行为。以下详细的知识点解读: 一、Java反射机制知识点 1. 反射机制概念:反射机制是指在...

    珍藏资料Java面试题以及答案.docx

    Overloaded 的方法是否可以改变返回值的类型?:Overload 是指同一个类中多个方法名称相同,但参数不同,而 Override 是指子类中重写父类的方法。Overloaded 的方法可以改变返回值的类型。 Java 抽象类和接口 10. ...

    移植Xposed的反射工具类

    1. **理解Java反射**:反射是Java语言的一个重要特性,它允许程序在运行时动态地获取类的信息(如类名、方法名、参数类型等)并调用这些方法。在Java中,`java.lang.reflect`包提供了Class、Constructor、Method和...

    2014年Java最全面试题以及答案.

    Overloaded的方法不能只改变返回值的类型而不改变参数列表。 9. Final类有什么特点? 使用final声明的类不能有子类,即该类不能被继承。final类中的方法默认是final的,而final类中的成员变量则必须在声明时或构造...

    JAVA 综合面试题.doc

    Overloaded 的方法可以改变返回值的类型。 2. Final 类的特点:Final 类不能被继承。 3. 继承时候类的执行顺序问题:父类的静态变量和静态代码块优先于子类的静态变量和静态代码块被执行。 4. 内部类的实现方式:...

    java语言基础.zip

    方法可以有参数和返回值。 10. **类与对象**: 类是封装数据和行为的容器,通过`public class ClassName{}`定义。对象是类的实例,通过`ClassName obj = new ClassName();`创建。 11. **封装**: 封装是面向对象...

    java 程序设计笔记

    - 覆盖是指子类重新定义父类已有的方法,与父类完全相同的方法名、返回值和参数类型列表。 - 重载与方法覆盖不同的是,重载不要求参数类型列表相同,实际上是新加的方法。 6. 访问控制符: - static:静态域保存...

    java基础语法.pdf

    9. **方法**:方法是代码的重用单元,讲解如何定义、调用方法,以及传递参数和返回值。 10. **字符串**:Java中的String类是处理文本的重要工具,会介绍其特性、常用方法以及字符串操作。 11. **类与对象**:Java...

    用于回顾java基础知识 Java学习资

    6. **方法**:方法是Java中组织代码的单元,可以接受参数并返回值。它们使得代码重用和模块化成为可能。 7. **数组**:数组是相同类型的数据元素的集合,可以通过索引访问其元素。Java也支持多维数组。 8. **封装...

    java深度复制源代码

    - **反射机制**:该工具类大量使用了Java反射API(如`Introspector.getBeanInfo()`、`PropertyDescriptor`等)来获取和设置JavaBean的属性。 - **泛型**:使用了泛型`&lt;T&gt;`,使得该工具类可以应用于任意类型的...

    Java函数速查

    它涵盖了Java语言中各种核心类库、API及常用函数的使用方法,旨在帮助开发者快速查找和理解函数的用途、参数及返回值,提高编程效率。以下是对Java函数的一些主要知识点的详细说明: 1. **基础类型与包装类** - ...

    Java企业级开发综合技能知识总结

    Overloaded的方法是否可以改变返回值的类型?** - **Overload**: 方法重载,在同一个类中多个方法具有相同的名称但参数列表不同。 - **Override**: 方法重写,子类重写父类的方法。 - Overloaded的方法可以有不同...

    2014 最新Java面试题总汇

    方法重载(Overload)和方法重写(Override)的区别,在于重载是在同一个类中多个同名方法但参数列表不同,重写是在子类中覆盖父类的方法,且返回值类型不能改变。Final类不能被继承,Final变量一旦赋值后不可变。 继承...

    Thinking in Java 中文第四版+习题答案

    2.5 方法、自变量和返回值 2.5.1 自变量列表 2.6 构建Java程序 2.6.1 名字的可见性 2.6.2 使用其他组件 2.6.3 static关键字 2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入...

    Java 语言学习 JAVA学习精品

    12. **Java反射机制** - 运行时动态获取类信息,创建对象,调用方法。 - 动态代理:在运行时创建代理类,实现AOP(面向切面编程)。 13. **Java Swing和JavaFX** - 创建图形用户界面(GUI):JFrame、JButton、...

    《Java编程和高级应用开发》PPT

    Java的常量包括整型、长整型、浮点数和字符串常量,它们在程序执行过程中不可改变。 Java编程还包括数据类型的使用,如基本数据类型(如int、double)和引用类型(如类、接口和数组)。运算符、控制结构(如条件...

    01Java基础部分重要知识(

    9. **方法**:方法是代码的复用单元,包含参数传递和返回值。理解方法的作用、定义和调用对于提高代码的可读性和可维护性非常重要。 10. **类与对象**:面向对象编程的基础,包括类的定义(属性和方法),对象的...

    疯狂JAVA讲义

    学生提问:为什么方法的返回值类型不能用于区分重载的方法? 124 5.3 成员变量和局部变量 124 5.3.1 成员变量和局部变量 125 5.3.2 成员变量的初始化和内存中的运行机制 128 5.3.3 局部变量的初始化和内存中的...

    java笔记.docx

    Java的方法是实现代码重用的重要手段,可以带有参数,也可以返回值。方法参数允许我们将数据传递给方法,返回值则可以将计算结果返回给调用者。例如,一个求平方的方法可以声明为public int square(int num) { ...

Global site tag (gtag.js) - Google Analytics