我有以下课程:
package some.clazz.client;
import some.clazz.SomeClass;
public class SomeClassClient {
...
public SomeClass getProc();
...
}
Run Code Online (Sandbox Code Playgroud)
我已经通过在Maven 插件中使用ByteBuddy 转换getProc()从SomeClassClient类字节码中删除/缩小/删除了这个Java 方法。但是语句仍然存在并由!new MemberRemoval().stripMethods(ElementMatcher);net.bytebuddy:byte-buddy-maven-pluginimport some.clazz.SomeClass;CFR Java Decompiler
SomeClass类中没有任何其他对类的引用SomeClassClient。
如何从字节码中删除这个导入语句(我真的假设它位于常量池中)?因为我在尝试使用“SomeClassClient”类时仍然遇到 ClassNotFoundException。
我的课
public class MethodsRemover implements net.bytebuddy.build.Plugin {
...
@Override
public DynamicType.Builder<?> apply(DynamicType.Builder<?> builder,
TypeDescription typeDescription,
ClassFileLocator classFileLocator) {
try{
return builder.visit(new MemberRemoval().stripMethods(
ElementMatchers.any().and(
isAnnotatedWith(Transient.class)
.and(
t -> {
log.info(
"ByteBuddy transforming class: {}, strip method: {}",
typeDescription.getName(),
t
);
return true;
}
) …Run Code Online (Sandbox Code Playgroud) 我想从 Java 动态调用本机方法。因为方法签名在编译时是未知的,所以我为大多数具有相同签名的原始返回类型创建了通用本机方法:
class NativeHook {
public static native int callInt(String funcName, Object... funcArgs);
public static native void callVoid(String funcName, Object... funcArgs);
public static native Object callObject(String funcName, Object... funcArgs);
private static MethodHandle getNativeMethod(String callName, Class<?> returnType) {
return MethodHandles.lookup().findStatic(NativeHook.class, callName,
MethodType.methodType(returnType, String.class, Object[].class));
}
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找创建一个 MethodHandle ,然后调用匹配的callXXX方法并传入装箱的方法,funcArgs就好像它们是单独提供的一样。这些callXXX方法可以这样访问:
MethodHandle callInt = getNativeMethod("callInt", int.class);
MethodHandle boundCallInt = callInt.bindTo("my_c_function_name").asVarargsCollector(Object[].class);
// returns NativeHook.callInt("my_c_function_name", 1, 2, 3)
boundCallInt.invokeWithArguments(1, 2, 3);
Run Code Online (Sandbox Code Playgroud)
我正在使用这个 bootstrap 方法callXXX在 invokeDynamic 中间接引用这个方法,它的工作方式与上面相同: …
F_SAME 在 ASM 中到底有什么用?我在Java虚拟机指令集中查找了这个助记符,没有找到任何相关内容。
我了解堆栈映射框架并且它们节省空间。
但是,为什么在跳转目标、异常处理程序或遵循无条件跳转指令的情况下精确使用该助记符?
尽管如此,还是不可能“预测”堆栈内容的类型?
使用这个是强制性的吗?
我对此进行了很多搜索,但几乎在任何地方都找不到与之相关的任何内容。
谢谢你!
我正在使用asm库进行java检测,我想要检测"导入"指令.这样通过使用visitMethodInsn和INVOKEVIRTUAL,我就能从我的包中调用一个函数.我知道当我有一个字节码时,链接阶段结束了,所以我可能会遇到麻烦.任何解决方案/绕行?
我正在使用ASM来转换java类.我想将生成的字节数组保存到.class文件中,而不是将字节数组加载到内存中.ASM手册说这是可能的,但没有给出一个例子.我怎样才能做到这一点?
总结:使用 ASM,给定一个字节码类,对于每个方法指令(MethodInsnNode),我需要获取正在使用的引用。
考虑以下类:
public void myMethod(){
String str1 = "str12";
String str2 = str1;
String str3 = "str3";
Boolean myBool = true;
Boolean myBool2 = true;
Cemo cemo = new Cemo();
assertTrue(cemo.isTrue());
assertTrue(cemo.isTrue());
Run Code Online (Sandbox Code Playgroud)
}
考虑以下生成的字节码指令:
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public void myMethod();
Code:
0: ldc #2 // String str12
2: astore_1
3: aload_1
4: astore_2
5: ldc #3 // String str3
7: astore_3
8: iconst_1
9: invokestatic #4 // Method java/lang/Boolean.valueOf:(Z)Ljava/lang/Boolean; …Run Code Online (Sandbox Code Playgroud) java bytecode bytecode-manipulation java-bytecode-asm jvm-bytecode
我正在尝试使用访问者 API 通过 ASM 6 实现一些类转换。我需要知道某个字段是否具有特定的访问标志。例如,字段可以是 ACC_PUBLIC + ACC_STATIC。在visitField方法中,访问标志是9。那么我如何知道该字段是否是静态的?
谢谢
是否可以在没有 Java 代理的情况下动态检测 Java 字节码?我之前使用 Java 代理检测过字节码,做了类似的事情:
ClassFileTransformer myTransformer = new Transformer();
instrument.addTransformer(myTransformer, true);
instrument.retransformClasses(classInstance);
instrument.removeTransformer(myTransformer);
Run Code Online (Sandbox Code Playgroud)
但是,如果不使用 Java 代理,这可能吗?我想要做的是调用一个方法,该方法将在 JVM 运行后的任何给定时间进行检测,而无需使用代理。
我正在尝试使用 asm 从 Java 类字节码中提取方法参数信息MethodVisitor。visitParameter的方法MethodVisitor未被调用(因为编译后的类文件中不存在参数名称)。如何获取方法参数及其类型的计数?
到目前为止我发现的唯一的就是fromdesc的参数。我可以从 asm-util 复制粘贴类,重写大约 50 行代码以将参数声明存储到 List/array 而不是单个。visitMethodMethodVisitorTraceSignatureVisitorStringBuffer
答案“/sf/ask/1264311191/”中建议了另一种选择:
可以使用以下要点中的代码根据方法描述来计算该方法的参数数量:https: //gist.github.com/VijayKrishna/6160036。使用该
parseMethodArguments(String desc)方法,您可以轻松计算该方法的参数数量。
从我的角度来看,复制粘贴和重写TraceSignatureVisitor还是更好。
但我认为应该有更简单的方法来处理 asm-util 中的方法签名。有没有?
这只是一个有趣的学习实验.我正在bytecode操纵着.
我只是瞎搞与学习asm在java.我想知道是否可以从接口替换方法的返回类型.
假设我有一个interface:
interface Modifiable {
Integer a();
}
Run Code Online (Sandbox Code Playgroud)
我应该创建一个类的副本,将其加载到class loader,然后修改这个新的接口?
如果可能,这个更改将在编译时提供?可以这么说,我ide自动完成了那些新方法.