使用getInterfaces()

时间:2015-10-07 06:32:49

标签: java jdbc javaagents

我正在尝试设法实现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();

1 个答案:

答案 0 :(得分:3)

原因是你正在寻找String类的接口,因为变量 className 实际上是一个字符串。

您可以在方法中传递Class className或使用

Class c = Class.forName("Fully qualified class Name");
c.getInterfaces();