JDK中的一个类的一个函数,返回值不符合我们的要求。
比如: class A{
public String getInfo(){
return "info";
}
}
现在想修改这个类的 getInfo() 函数。比如 public String getInfo(){
return "MY info";
}
请问有没有办法不修改JDK 的代码,动态地修改这个类的getInfo函数?
比如: class A{
public String getInfo(){
return "info";
}
}
现在想修改这个类的 getInfo() 函数。比如 public String getInfo(){
return "MY info";
}
请问有没有办法不修改JDK 的代码,动态地修改这个类的getInfo函数?
看来我又没有话说清楚。这个类不是我要用。
是JDK中的代码要用到这个类。JDK可能在其它的地方都有用到这个类,我没办法修改到这些代码。。
自己写一个方法,方法体是jdk那个方法的代码 只是你做了下小修改。
return "MY "+s;
}
不一定要去修改JDK内部的源码啊。
利用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/
首先要恭喜楼主解决了现有的问题。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方法。
当然这只是给楼主一个简单的提醒。
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
要修改这个主要是因为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属性的值了。
这两种应该是比较标准的做法了,谢谢!
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