Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.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本地类_Java_Reflection - Fatal编程技术网

反射地实例化Java本地类

反射地实例化Java本地类,java,reflection,Java,Reflection,在Java中,有没有一种方法或技巧可以反射地实例化一个实例 这是我的测试课: package com.example.localclass; import org.junit.Test; public class LocalClassInstantiationTest { @Test public void testInstantiateLocalClassReflectively() { System.out.println("About to defin

在Java中,有没有一种方法或技巧可以反射地实例化一个实例

这是我的测试课:

package com.example.localclass;

import org.junit.Test;

public class LocalClassInstantiationTest {

    @Test
    public void testInstantiateLocalClassReflectively() {
        System.out.println("About to define local class");
        class LocalClass {
            void print() {
                System.out.println("Hello world");
            }
        }

        System.out.println("--------------------Direct instantiation------------------------");
        LocalClass localClassInstance;
        localClassInstance = new LocalClass();
        localClassInstance.print();

        System.out.println("--------------------Reflective instantiation--------------------");
        Class<LocalClass> localClazz = LocalClass.class;
        System.out.println("Local class name: " + localClazz.getName() );
        System.out.println("Local class canonical name: " + localClazz.getCanonicalName() );
        System.out.println("Local class constructors array length: " + localClazz.getConstructors().length);
        System.out.println("About to create local class instance reflectively");

        try {
            localClassInstance = localClazz.newInstance();
            localClassInstance.print();
        } catch (InstantiationException | IllegalAccessException e) {
            e.printStackTrace();
        }

    }

}

在您的例子中,问题是您的类没有空构造函数。newInstance()假定您有一个实例,如果没有,则会失败

如果在诸如main之类的静态方法中运行,则不会出现此错误

这是因为您有一个非静态匿名类,并且隐式地需要对外部类LocalClassInstallationTest的引用,无论您是否使用它

你可以试试这个

System.out.println("Local class constructors array length: " + 
                   localClazz.getDeclaredConstructors().length);
System.out.println("About to create local class instance reflectively");

try {
    localClassInstance = localClazz
            .getDeclaredConstructor(LocalClassInstantiationTest.class)
            .newInstance(this);
    localClassInstance.print();
} catch (NoSuchMethodException | InvocationTargetException | InstantiationException | IllegalAccessException e) {
    e.printStackTrace();
}
你的程序会打印出来

About to define local class
--------------------Direct instantiation------------------------
Hello world
--------------------Reflective instantiation--------------------
Local class name: LocalClassInstantiationTest$1LocalClass
Local class canonical name: null
Local class constructors array length: 1
About to create local class instance reflectively
Hello world

在您的例子中,问题是您的类没有空构造函数。newInstance()假定您有一个实例,如果没有,则会失败

如果在诸如main之类的静态方法中运行,则不会出现此错误

这是因为您有一个非静态匿名类,并且隐式地需要对外部类LocalClassInstallationTest的引用,无论您是否使用它

你可以试试这个

System.out.println("Local class constructors array length: " + 
                   localClazz.getDeclaredConstructors().length);
System.out.println("About to create local class instance reflectively");

try {
    localClassInstance = localClazz
            .getDeclaredConstructor(LocalClassInstantiationTest.class)
            .newInstance(this);
    localClassInstance.print();
} catch (NoSuchMethodException | InvocationTargetException | InstantiationException | IllegalAccessException e) {
    e.printStackTrace();
}
你的程序会打印出来

About to define local class
--------------------Direct instantiation------------------------
Hello world
--------------------Reflective instantiation--------------------
Local class name: LocalClassInstantiationTest$1LocalClass
Local class canonical name: null
Local class constructors array length: 1
About to create local class instance reflectively
Hello world

因此,对于内部类,所有构造函数都有一个隐式的第一个参数,通过该参数传递包含的实例?@Bohemian correct。序列化是一个问题,你可以尝试序列化外部类,如果你不使用它,这会很痛苦。你已经得到了我的+1,但我不知道!有趣的谢谢你的发帖!:)我可以自己尝试,但是否该参数仅可反射使用?ie无法在代码中将其作为
new InnerClass(outerInstance)
作为
outerInstance.new InnerClass()?如果是这样的话,那真的很有趣。
newInstance()
对于本地类,只要有闭包引用,就可以使用同样多的参数,即使在静态的
main()
中也是如此,这使得它们在一般情况下很难实例化。内部类要容易得多,只需要额外的单个封闭类实例作为第一个参数。因此,对于内部类,所有传递包含实例的构造函数都有一个隐式的第一个参数?@Bohemian correct。序列化是一个问题,你可以尝试序列化外部类,如果你不使用它,这会很痛苦。你已经得到了我的+1,但我不知道!有趣的谢谢你的发帖!:)我可以自己尝试,但是否该参数仅可反射使用?ie无法在代码中将其作为
new InnerClass(outerInstance)
作为
outerInstance.new InnerClass()?如果是这样的话,那真的很有趣。
newInstance()
对于本地类,只要有闭包引用,就可以使用同样多的参数,即使在静态的
main()
中也是如此,这使得它们在一般情况下很难实例化。内部类要容易得多,只将额外的单个封闭类实例作为第一个参数。