小编Man*_*eer的帖子

javassist在pre-main方法中加载一个类文件(java instrumentation)

我正在尝试使用javassist加载一个特定的类,我在pre-main方法中执行此操作,如下所示:

public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
                        ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException 
{
   byte[] byteCode = classfileBuffer;

   if(className.toLowerCase().endsWith("class1"))
   {
       ClassPool classPool = ClassPool.getDefault();
       CtClass ctClass = classPool.get("com.class2");
   }
}
Run Code Online (Sandbox Code Playgroud)

但不幸的是,我得到一个NotFoundException ....

com.class2是一个在加载class1后将由类加载器加载的类,但我发现为class1添加一个返回类型为com.class2的新方法

我尝试了stackoverflow.com内的所有解决方案,但没有任何结果.....

最后,class1和class2都在同一个包中并且在同一个JAR文件中,class1有一个类型为class2的成员,但我不知道为什么这个classpool无法加载第二个.

这里的堆栈跟踪:

Exception: javassist.NotFoundException: com.Class2
 javassist.NotFoundException: com.Class2
at javassist.ClassPool.get(ClassPool.java:439)
at javassist.ClassPool.getCtClass(ClassPool.java:504)
at com.stuff.MainAppletTransformer.transform(MainAppletTransformer.java:69)
at sun.instrument.TransformerManager.transform(Unknown Source)
at sun.instrument.InstrumentationImpl.transform(Unknown Source)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at …
Run Code Online (Sandbox Code Playgroud)

java instrumentation javassist

14
推荐指数
1
解决办法
2528
查看次数

如何在不双击JNLP的情况下自动启动java web启动

我有一个java applet应用程序,我们的客户可以通过我们的网站访问它.由于Microsoft edge和chrome停止支持java插件,我们将applet转换为通过JNLP和Java Web Start启动,不幸的是,在两个浏览器中,JNLP已下载,客户应双击该文件以启动Java Web Start.

我们的客户对这种行为感到非常失望,我正试图找到解决这个问题的方法.

java jnlp google-chrome java-web-start microsoft-edge

9
推荐指数
1
解决办法
5万
查看次数

在pre-main方法中使用javassist在运行时重命名字段(java instrumentation)

我想在运行时重命名java类中的字段.此外,任何访问该字段的方法;读取或写入; 我需要将其修改为使用新名称而不是旧名称....

所有这些都将在pre-main方法中完成......

作为Exmaple,给出以下代码:

public class Class1
{
    String strCompany;

    public String Test()
    {
         strCompany = "TestCompany";
         return strCompany;
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的类中,我需要将字段"strCompany"更改为"strCompany2",另外我需要使用方法Test来使用新名称而不是旧名称....

可以使用ctField类中的setName方法更改字段名称,但是如何修改方法体以使用新名称.

java instrumentation javassist

6
推荐指数
1
解决办法
1350
查看次数

无法通过代理隧道.代理返回HTTP/1.1 503服务不可用

我想连接到Intranet服务器,我需要连接的URL是:

URLConnection conn = new URL("https://mywebsite").openConnection();
Run Code Online (Sandbox Code Playgroud)

当我通过以下方式调用connect方法时:`

conn.connect();
Run Code Online (Sandbox Code Playgroud)

我收到以下异常:

java.io.IOException: Unable to tunnel through proxy. Proxy rerurns HTTP/1.1 503 Service Unavailable"
at sun.net.www.protocol.httpHttpURLConnection.doTunneling
Run Code Online (Sandbox Code Playgroud)

我怎么能解决这个例外,我已尝试过在网上发布的许多解决方案,但没有任何运气.

java proxy ioexception tunneling

6
推荐指数
1
解决办法
9300
查看次数

在 JavaFx 中格式化表视图中的最后一行

我需要通过 CSS 格式化 JavaFX 中表格视图的最后一行,如果在 CSS 中不可能,那么如何在代码中做到这一点。

css java fxml javafx-8

1
推荐指数
1
解决办法
2163
查看次数