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



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

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

我张贴了一些代码来解释

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);
    }
}

就像您使用getConstructor()来获得Constructor对象一样,您可以使用getMethod()getMethods()来获得Method对象。

Method m = klazz.getMethod("methodName", parameters);  // Parameters optional
m.invoke(obj, parameters);  // Ditto

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

根据名称和调用方法创建对象

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());
    }
}

用这个代替klass.getClass().cast(obj).Run();:

try {
  Method method = klass.getMethod("Run");
  method.invoke(obj, new Object[0]);
} catch (Exception ex) {
  ex.printStackTrace();
}

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

一旦你有了这个类和它的一个实例,你可以尝试使用Class的这个方法来找到特定的方法:

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

提供方法的名称和期望的参数。如果一切顺利,您将找到它,并可以使用Method类中的这个方法调用它:

public Object invoke(Object obj, Object... args)

您提供您的实例和您需要的参数,并获得结果。

你也可以使用Object类方法通过重写该方法你可以访问类的普通方法我们知道Object类是所有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();
        }
    }

相关内容

  • 没有找到相关文章

最新更新