Java-从名称和调用方法创建对象

Java-从名称和调用方法创建对象,java,reflection,Java,Reflection,我需要编写一个Java代码,在给定类名的情况下,创建该类型的对象并对其调用方法 我使用了Java.lang.Class.cast(),但是这条指令返回一个对象,并且没有我想要在对象类中运行的方法(显然) 我发布了一些解释代码 import java.lang.reflect.*; public class Loader { public static void main(String[] args) throws Exception { String classNam

我需要编写一个Java代码,在给定类名的情况下,创建该类型的对象并对其调用方法

我使用了Java.lang.Class.cast(),但是这条指令返回一个对象,并且没有我想要在对象类中运行的方法(显然)

我发布了一些解释代码

import java.lang.reflect.*;

public class Loader {
    public static void main(String[] args) throws Exception {

        String className = "Test";
        Class[] arguments = new Class[] { int.class, int.class };
        Class klass = Class.forName(className);

        Constructor constuctor = klass.getConstructor(arguments);
        Object obj = constuctor.newInstance(new Object[] { 10, 20 });
        klass.getClass().cast(obj).Run(); // <----- PROBLEM
        // this works: ((Test)obj).Run();
    }
}

class Test {
    int a, b;
    public Test(int a1, int b1) {
        a = a1; b = b1;
    }

    public void Run() {
        System.out.println("Run...");
        System.out.println(a + " " + b);
    }
}
import java.lang.reflect.*;
公共类加载器{
公共静态void main(字符串[]args)引发异常{
字符串className=“Test”;
类[]参数=新类[]{int.Class,int.Class};
Class klass=Class.forName(className);
构造函数Constructor=klass.getConstructor(参数);
objectobj=constructor.newInstance(新对象[]{10,20});

klass.getClass().cast(obj.Run();//就像您使用
getConstructor()
获取
Constructor
对象一样,您可以使用
getMethod()
getMethods()获取
Method
对象


另一个选项是将对象强制转换(使用常规强制转换,您“永远”不需要使用
Class.cast()
)到已知接口,并以常规方式调用它。

使用此方法而不是
klass.getClass().cast(obj.Run();


您需要检索该方法,就像对构造函数所做的那样,然后使用
invoke
调用该方法,将调用该方法的对象作为第一个参数,将
Object
数组作为第二个参数,以指定传递给该方法的任何参数(在您的情况下,这些参数是非参数)

public Method getMethod(String name, Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException

您可以提供您的实例和所需的参数并获得结果。

您还可以使用对象类方法,通过重写该方法,您可以访问类的普通方法,正如我们所知,对象类是所有java类的超类,因此通过重写特定方法,您可以作为

    class hello{
       public int hashCode(){
              fun();
       } 
       public void fun(){
               System.out.println("Successfully Enter in class");
       }
    }
    class call{
        public static void main(String[] args)
        {
             Class.forName("hello").newInstance().hashCode();
        }
    }

从name和call方法创建对象

public interface Element {
    int getId();
    String getName();
    String getFamily();
}

public class Person implements Element {
    private int Id;
    private String name;
    private String family;

    public Person() {

    }
    public Person(int id, String name, String family) {
        Id = id;
        this.name = name;
        this.family = family;
    }
    @Override
    public int getId() {
        return Id;
    }
    @Override
    public String getName() {
        return name;
    }
    @Override
    public String getFamily() {
        return family;
    }
    public void setId(int id) {
        Id = id;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setFamily(String family) {
        this.family = family;
    }
}

从名称和调用方法创建对象:

public static void main(String[] args) {

    try {

        String classImportName = "database.test.Person";
        Class objClass = Class.forName(classImportName);
        Constructor constuctor = objClass.getConstructor();
        Object obj = constuctor.newInstance();


        Method callMethod = obj.getClass().getDeclaredMethod("setFamily", String.class);
        callMethod.setAccessible(true);
        callMethod.invoke(obj, "test");

        /*Field field = obj.getClass().getDeclaredField("family");
        field.setAccessible(true);
        field.set(obj,"delphani");*/

        Element elm = (Element) obj;
        System.out.println(elm.getFamily());

        //In the case the person class does not implement the 'element' Interface
        Method callMethod2 = obj.getClass().getDeclaredMethod("getFamily");
        callMethod2.setAccessible(true);
        String res = (String) callMethod2.invoke(obj);

        System.out.println("Result : " + res);

    }
    catch (Exception ex)
    {
        System.out.println(ex.getMessage());
    }
}
    class hello{
       public int hashCode(){
              fun();
       } 
       public void fun(){
               System.out.println("Successfully Enter in class");
       }
    }
    class call{
        public static void main(String[] args)
        {
             Class.forName("hello").newInstance().hashCode();
        }
    }
public interface Element {
    int getId();
    String getName();
    String getFamily();
}

public class Person implements Element {
    private int Id;
    private String name;
    private String family;

    public Person() {

    }
    public Person(int id, String name, String family) {
        Id = id;
        this.name = name;
        this.family = family;
    }
    @Override
    public int getId() {
        return Id;
    }
    @Override
    public String getName() {
        return name;
    }
    @Override
    public String getFamily() {
        return family;
    }
    public void setId(int id) {
        Id = id;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setFamily(String family) {
        this.family = family;
    }
}
public static void main(String[] args) {

    try {

        String classImportName = "database.test.Person";
        Class objClass = Class.forName(classImportName);
        Constructor constuctor = objClass.getConstructor();
        Object obj = constuctor.newInstance();


        Method callMethod = obj.getClass().getDeclaredMethod("setFamily", String.class);
        callMethod.setAccessible(true);
        callMethod.invoke(obj, "test");

        /*Field field = obj.getClass().getDeclaredField("family");
        field.setAccessible(true);
        field.set(obj,"delphani");*/

        Element elm = (Element) obj;
        System.out.println(elm.getFamily());

        //In the case the person class does not implement the 'element' Interface
        Method callMethod2 = obj.getClass().getDeclaredMethod("getFamily");
        callMethod2.setAccessible(true);
        String res = (String) callMethod2.invoke(obj);

        System.out.println("Result : " + res);

    }
    catch (Exception ex)
    {
        System.out.println(ex.getMessage());
    }
}