Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有RMI调用的类加载器_Java_Classloader_Rmi_Profiler - Fatal编程技术网

Java 带有RMI调用的类加载器

Java 带有RMI调用的类加载器,java,classloader,rmi,profiler,Java,Classloader,Rmi,Profiler,我正在尝试制作简单的java探查器,并为此使用ClassLoader 这是我对ClassLoader的实现: import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; public class CustomClassLoader extends ClassLoader { private Notifier notifier;

我正在尝试制作简单的java探查器,并为此使用ClassLoader

这是我对ClassLoader的实现:

import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class CustomClassLoader extends ClassLoader {
    private Notifier notifier;

    public CustomClassLoader() {
        super();
    }

    public CustomClassLoader(ClassLoader parent) {
        super(parent);
    }

    private void initNotifier() {
        if (notifier != null) return;
        try {
            System.out.println("2");
            Registry registry = LocateRegistry.getRegistry(Const.registryPort);
            System.out.println("3");
            notifier = (Notifier) registry.lookup(Const.stubName);
            System.out.println("4");
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(1);
        }
    }

    @Override
    protected synchronized Class<?> loadClass(String name, boolean resolve) 
                                    throws ClassNotFoundException {
        System.out.println("0");
        Class clazz = super.loadClass(name, resolve);
        System.out.println("1");
        initNotifier();
        System.out.println("5");
        try {
            notifier.classLoaded(name);
            System.out.println("6");
        } catch (RemoteException e) {
            e.printStackTrace();
            System.exit(1);
        }
        return clazz;
    }
}
import java.rmi.RemoteException;
导入java.rmi.registry.LocateRegistry;
导入java.rmi.registry.registry;
公共类CustomClassLoader扩展了ClassLoader{
专用通知程序通知程序;
公共CustomClassLoader(){
超级();
}
公共CustomClassLoader(ClassLoader父级){
超级(家长);
}
私有void initNotifier(){
if(notifier!=null)返回;
试一试{
系统输出打印项次(“2”);
Registry Registry=LocateRegistry.getRegistry(Const.registryPort);
系统输出打印项次(“3”);
通知程序=(通知程序)registry.lookup(Const.stubName);
系统输出打印项次(“4”);
}捕获(例外e){
e、 printStackTrace();
系统出口(1);
}
}
@凌驾
受保护的同步类loadClass(字符串名称,布尔解析)
抛出ClassNotFoundException{
系统输出打印项次(“0”);
Class clazz=super.loadClass(名称,解析);
系统输出打印项次(“1”);
initNotifier();
系统输出打印项次(“5”);
试一试{
通知程序.classLoaded(名称);
系统输出打印项次(“6”);
}捕获(远程异常){
e、 printStackTrace();
系统出口(1);
}
回击声;
}
}
当我尝试使用这个类加载器时,我收到这个输出(我尝试使用1.6_37和1.7_10 jkd):

C:\Users\Scepion1d>java-cp C:\Users\Scepion1d\Dropbox\Workspace\IntellijIDEA\pr
ofiler\out\artifacts\loader\loader.jar;C:\Users\Scepion1d\Dropbox\Workspace\Inte
llijIDEA\app\out\production\app-Djava.system.class.loader=CustomClassLoader Main
0
1.
2.
0
1.
2.
3.
0
1.
2.
3.
java.lang.IllegalArgumentException:非正延迟:0
位于sun.misc.GC$LatencyRequest(GC.java:190)
位于sun.misc.GC$LatencyRequest(GC.java:156)
位于sun.misc.GC.requestLatency(GC.java:254)
位于sun.rmi.transport.DGCClient$EndpointEntry.lookup(DGCClient.java:212)
位于sun.rmi.transport.DGCClient.registerRefs(DGCClient.java:120)
位于sun.rmi.transport.ConnectionInputStream.registerRefs(ConnectionInputS
tream.java:80)
在sun.rmi.transport.StreamRemoteCall.releaseInputStream(StreamRemoteCal
l、 爪哇:138)
位于sun.rmi.transport.StreamRemoteCall.done(StreamRemoteCall.java:292)
位于sun.rmi.server.UnicastRef.done(UnicastRef.java:431)
位于sun.rmi.registry.RegistryImpl\u Stub.lookup(未知源)
位于CustomClassLoader.initNotifier(CustomClassLoader.java:22)
在CustomClassLoader.loadClass(CustomClassLoader.java:35)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:247)
位于sun.security.jca.ProviderConfig$3.run(ProviderConfig.java:234)
位于java.security.AccessController.doPrivileged(本机方法)
位于sun.security.jca.ProviderConfig.doLoadProvider(ProviderConfig.java:22
5)
位于sun.security.jca.ProviderConfig.getProvider(ProviderConfig.java:205)
位于sun.security.jca.ProviderList.getProvider(ProviderList.java:215)
位于sun.security.jca.ProviderList.getService(ProviderList.java:313)
位于sun.security.jca.GetInstance.GetInstance(GetInstance.java:140)
位于java.security.security.getImpl(security.java:659)
位于java.security.MessageDigest.getInstance(MessageDigest.java:129)
位于java.rmi.dgc.VMID.computeAddressHash(VMID.java:140)
位于java.rmi.dgc.VMID.(VMID.java:27)
在sun.rmi.transport.DGCClient.(DGCClient.java:66)
位于sun.rmi.transport.ConnectionInputStream.registerRefs(ConnectionInputS
tream.java:80)
在sun.rmi.transport.StreamRemoteCall.releaseInputStream(StreamRemoteCal
l、 爪哇:138)
位于sun.rmi.transport.StreamRemoteCall.done(StreamRemoteCall.java:292)
位于sun.rmi.server.UnicastRef.done(UnicastRef.java:431)
位于sun.rmi.registry.RegistryImpl\u Stub.lookup(未知源)
位于CustomClassLoader.initNotifier(CustomClassLoader.java:22)
在CustomClassLoader.loadClass(CustomClassLoader.java:35)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:247)
位于sun.security.jca.ProviderConfig$3.run(ProviderConfig.java:234)
位于java.security.AccessController.doPrivileged(本机方法)
位于sun.security.jca.ProviderConfig.doLoadProvider(ProviderConfig.java:22
5)
位于sun.security.jca.ProviderConfig.getProvider(ProviderConfig.java:205)
位于sun.security.jca.ProviderList.getProvider(ProviderList.java:215)
位于sun.security.jca.ProviderList$3.get(ProviderList.java:130)
位于sun.security.jca.ProviderList$3.get(ProviderList.java:125)
位于java.util.AbstractList$Itr.next(AbstractList.java:345)
位于java.security.SecureRandom.getPrngAlgorithm(SecureRandom.java:522)
位于java.security.SecureRandom.getDefaultPRNG(SecureRandom.java:165)
位于java.security.SecureRandom。(SecureRandom.java:133)
位于java.rmi.server.UID。(UID.java:92)
位于java.rmi.server.ObjID(ObjID.java:71)
位于java.rmi.registry.LocateRegistry.getRegistry(LocateRegistry.java:158)
位于java.rmi.registry.LocateRegistry.getRegistry(LocateRegistry.java:106)
位于java.rmi.registry.LocateRegistry.getRegistry(LocateRegistry.java:73)
位于CustomClassLoader.initNotifier(CustomClassLoader.java:20)
在CustomClassLoader.loadClass(CustomClassLoader.java:35)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:247)
我认为问题出在RMI服务器上,但我编写了另一个RMI客户机,它运行良好。
有人知道问题在哪里以及如何解决吗;DR:不要使用像根类加载器这样会产生严重副作用的类加载器

问题是类sun.rmi上的常量字段gcInterval
C:\Users\Scepion1d>java -cp C:\Users\Scepion1d\Dropbox\Workspace\IntellijIDEA\pr
ofiler\out\artifacts\loader\loader.jar;C:\Users\Scepion1d\Dropbox\Workspace\Inte
llijIDEA\app\out\production\app -Djava.system.class.loader=CustomClassLoader Main
0
1
2
0
1
2
3
0
1
2
3
java.lang.IllegalArgumentException: Non-positive latency: 0
        at sun.misc.GC$LatencyRequest.<init>(GC.java:190)
        at sun.misc.GC$LatencyRequest.<init>(GC.java:156)
        at sun.misc.GC.requestLatency(GC.java:254)
        at sun.rmi.transport.DGCClient$EndpointEntry.lookup(DGCClient.java:212)
        at sun.rmi.transport.DGCClient.registerRefs(DGCClient.java:120)
        at sun.rmi.transport.ConnectionInputStream.registerRefs(ConnectionInputS
tream.java:80)
        at sun.rmi.transport.StreamRemoteCall.releaseInputStream(StreamRemoteCal
l.java:138)
        at sun.rmi.transport.StreamRemoteCall.done(StreamRemoteCall.java:292)
        at sun.rmi.server.UnicastRef.done(UnicastRef.java:431)
        at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
        at CustomClassLoader.initNotifier(CustomClassLoader.java:22)
        at CustomClassLoader.loadClass(CustomClassLoader.java:35)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
        at sun.security.jca.ProviderConfig$3.run(ProviderConfig.java:234)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.security.jca.ProviderConfig.doLoadProvider(ProviderConfig.java:22
5)
        at sun.security.jca.ProviderConfig.getProvider(ProviderConfig.java:205)
        at sun.security.jca.ProviderList.getProvider(ProviderList.java:215)
        at sun.security.jca.ProviderList.getService(ProviderList.java:313)
        at sun.security.jca.GetInstance.getInstance(GetInstance.java:140)
        at java.security.Security.getImpl(Security.java:659)
        at java.security.MessageDigest.getInstance(MessageDigest.java:129)
        at java.rmi.dgc.VMID.computeAddressHash(VMID.java:140)
        at java.rmi.dgc.VMID.<clinit>(VMID.java:27)
        at sun.rmi.transport.DGCClient.<clinit>(DGCClient.java:66)
        at sun.rmi.transport.ConnectionInputStream.registerRefs(ConnectionInputS
tream.java:80)
        at sun.rmi.transport.StreamRemoteCall.releaseInputStream(StreamRemoteCal
l.java:138)
        at sun.rmi.transport.StreamRemoteCall.done(StreamRemoteCall.java:292)
        at sun.rmi.server.UnicastRef.done(UnicastRef.java:431)
        at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
        at CustomClassLoader.initNotifier(CustomClassLoader.java:22)
        at CustomClassLoader.loadClass(CustomClassLoader.java:35)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
        at sun.security.jca.ProviderConfig$3.run(ProviderConfig.java:234)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.security.jca.ProviderConfig.doLoadProvider(ProviderConfig.java:22
5)
        at sun.security.jca.ProviderConfig.getProvider(ProviderConfig.java:205)
        at sun.security.jca.ProviderList.getProvider(ProviderList.java:215)
        at sun.security.jca.ProviderList$3.get(ProviderList.java:130)
        at sun.security.jca.ProviderList$3.get(ProviderList.java:125)
        at java.util.AbstractList$Itr.next(AbstractList.java:345)
        at java.security.SecureRandom.getPrngAlgorithm(SecureRandom.java:522)
        at java.security.SecureRandom.getDefaultPRNG(SecureRandom.java:165)
        at java.security.SecureRandom.<init>(SecureRandom.java:133)
        at java.rmi.server.UID.<init>(UID.java:92)
        at java.rmi.server.ObjID.<clinit>(ObjID.java:71)
        at java.rmi.registry.LocateRegistry.getRegistry(LocateRegistry.java:158)

        at java.rmi.registry.LocateRegistry.getRegistry(LocateRegistry.java:106)

        at java.rmi.registry.LocateRegistry.getRegistry(LocateRegistry.java:73)
        at CustomClassLoader.initNotifier(CustomClassLoader.java:20)
        at CustomClassLoader.loadClass(CustomClassLoader.java:35)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)