JDK中的一个类的一个函数,返回值不符合我们的要求。
比如: class A{
public String getInfo(){
return "info";
}
}
现在想修改这个类的 getInfo() 函数。比如 public String getInfo(){
return "MY info";
}
请问有没有办法不修改JDK 的代码,动态地修改这个类的getInfo函数?

解决方案 »

  1.   

    不是继承。。
    看来我又没有话说清楚。这个类不是我要用。
    是JDK中的代码要用到这个类。
    JDK可能在其它的地方都有用到这个类,我没办法修改到这些代码。。
      

  2.   

    修改代码,然后使用 bootclasspath 在载入jdk自带库之前载入修改过的。
      

  3.   

    楼主真牛,连JDK里面的东西都想修改
      

  4.   

    必须找到在JDK中这个类的java源文件,然后编译成以.class结尾文件的字节码文件,必须这样,不可动态地修改...因为在开发中,是以类库的形式加入到项目中的
      

  5.   

    继承这个方法所在的类或者接口,然后重写该方法。当然如果没法继承过来的话就只能
    自己写一个方法,方法体是jdk那个方法的代码 只是你做了下小修改。
      

  6.   

    可以用个修饰模式,包装下返回值就行了 public String getInfo(String s){
    return "MY "+s;
    }
      

  7.   

    这种编译都不能通过。楼主:用适配器,装饰不都可以解决问题么???
    不一定要去修改JDK内部的源码啊。
      

  8.   

    java安裝目錄下有個src.zip找到你要修改的類,改好了重新編譯一下覆蓋掉rt.jar
      

  9.   

    终于搞定了。
    利用Java的反射机制。
    代码大概如下,修改了ORBImpl类中的localHostString的值。
    因为要修改的类中的localHostString属性是staitc的,所以用反射机制修改了一个实例的属性就达到了目的。
    JDK中其它的代码调用getLocalHost,得到的是修改后的值。 Class xxx = Class.forName("com.sun.corba.se.impl.orb.ORBImpl");
    Field filed = xxx.getDeclaredField("localHostString");
    filed.setAccessible(true);
    filed.set(orb, orbHost);算是曲线弄好了。动态修改类的函数还没有实现,不过也有一些文章提到,没有深入了解。
    http://www.ibm.com/developerworks/cn/java/j-lo-jse61/
      

  10.   


    首先要恭喜楼主解决了现有的问题。private static String localHostString = null;    private synchronized String getLocalHostName() 
        {
            if (localHostString == null) {
                try {
    localHostString = InetAddress.getLocalHost().getHostAddress();
                } catch (Exception ex) {
    throw wrapper.getLocalHostFailed( ex ) ;
                }
    }
    return localHostString ;
        }我特意去查看了一下相关的源码,楼主解决了手头上的问题,可能会引发其它的新问题。
    因为这里的localHostString 表示当前的主机对应的IP,其实楼主只需要修改相关的IP就可以解决这个问题的。 public boolean isLocalHost( String hostName ) 
        {
    synchronized (this) {
    checkShutdownState();
    }可能会引发的新问题就是,导致这里的判断返回错误的信息。本来不是本机的ip可是却了判断为正确了。因为这是一个public方法。
    当然这只是给楼主一个简单的提醒。
      

  11.   

    把修改的类编译好后放到jre\lib\endorsed下即可
      

  12.   

    你不可能修改 JDK 中的代码。Java 类加载器,也就是加载你自己写的类的类加载器,是不允许加载包名以 java. 开头的类。所以,你也不可能在 java 包中写东西。
      

  13.   

    unzip -p $JAVA_HOME/src.zip java/lang/String.java > String.java把 String的 valueOf(double d) 方法修改为直接返回一个字符串"0"mkdir classes
    javac -d classes String.java
    rm String.java 
    vim Example.java
    public class Example{
        public static void main(String[] args){
            System.out.println(String.valueOf(2.22));
        }
    }
    javac Example.java
    java -Xbootclasspath/p:classes Example 输出 0
      

  14.   

    谢谢提醒。
    要修改这个主要是因为corba要通过:InetAddress.getLocalHost().getHostAddress(),来得到通讯的IP。
    而且这个没法修改,或者通过参数什么来设定(如果有人知道有方法可以设置的话,麻烦告诉下我,谢谢)。
    操作系统有两个IP,一个是外网IP,一个是内网IP。corba通讯用的是内网IP。
    目前是主机名是www.xxx.com,和外网IP写死在hosts文件中了,不能修改。如:
    182.3.3.3   www.xxx.com  
    而corba要和内网的程序通讯,要用的IP是192.168.4.4 。
    这个就相当蛋疼了。corba程序通过InetAddress.getLocalHost().getHostAddress()得到的是182.3.3.3,没法和内网程序通讯。
    所以被迫要去更改com.sun.corba.se.impl.orb.ORBImpl中的localHostString属性的值了。
      

  15.   


    这两种应该是比较标准的做法了,谢谢!
    http://www.ibm.com/developerworks/cn/java/j-classpath-windows/jre\lib\endorsed
    放在 jre\lib\endorsed 目录中的 JAR 文件也被添加到了通过虚拟机运行的所有应用程序的类路径。不同的是,这里的文件被实际放入了 bootclasspath而不是通常的类路径,并可以代替 JDK 附带的标准类。这种方式对于在 VM 更新 XML 解析器和修复 bug 尤其有用。
    但是,如前所述,这种方法看起来十分方便,但实际上也存在长期的潜在问题,原因也一样。如果需要替换 JDK 类,可以在运行时使用 -Xbootclasspath/p选项来避免意外地加载错误版本的类。
    C:\project> java -classpath C:\classes 
           -Xbootclasspath/p:xercesImpl.jar com.elharo.gui.MainFrame