我正在尝试设法实现java.sql.PreparedStatement
接口的类。我在transform方法中使用以下代码尝试过它,但它甚至没有通过这样的类。但我正在使用包含executeQuery
方法的主类运行我的代理。
public byte[] transform(ClassLoader loader, String className, Class classBeingRedefined,
ProtectionDomain protectionDomain, byte[] classfileBuffer)
throws IllegalClassFormatException {
byte[] byteCode = classfileBuffer;
ClassPool classPool = ClassPool.getDefault();
try {
CtClass ctClass = classPool.makeClass(new ByteArrayInputStream(classfileBuffer));
if (!ctClass.isInterface()) {
CtMethod[] methods = ctClass.getDeclaredMethods();
Class[] interfaces =className.getClass().getInterfaces();
for (Class c : interfaces) {
System.out.println(c.getName());
if (c.getName().equals("java.sql.PreparedStatement")) {
System.out.println(c.getName());
for (CtMethod method : methods) {
if (method.getName().equals("executeQuery")) {
this.testSignature(method);
}
}
}
}
}
byteCode = ctClass.toBytecode();
ctClass.detach();
} catch (Throwable e) {
e.printStackTrace();
}
return byteCode;
}
我也尝试使用classBeingRedefined.getInterfaces()
,然后在某些类中返回nullPointerException,因为classBeingRedefined变为null。
修改1 c.getName()的输出是以下类名的长列表。
java.lang.CharSequence
java.io.Serializable
java.lang.Comparable
修改2
String fullyQualifiedClassName = className.replace('/','.');
Class currentClass = Class.forName(fullyQualifiedClassName);
Class[] interfaces = currentClass.getInterfaces();
答案 0 :(得分:3)
原因是你正在寻找String
类的接口,因为变量 className
实际上是一个字符串。
您可以在方法中传递Class className
或使用
Class c = Class.forName("Fully qualified class Name");
c.getInterfaces();