【问题标题】:correct use of java Commons BeanUtils?正确使用java Commons BeanUtils?
【发布时间】:2014-02-02 20:58:30
【问题描述】:

你好还在学习java中的一些概念。很抱歉,如果这是一个愚蠢的问题

我在一个罐子里有一堂课。我正在使用反射将它动态加载到我的类路径中。然后我像这样调用类构造方法:

        File jar = new File("C:\\Users\\JG\\Desktop\\testAlgorithm.jar");

        URL url = jar.toURI().toURL();            
        URL[] urls = new URL[]{url};

        ClassLoader cl = new URLClassLoader(urls);           
        Class classToLoad = Class.forName ("testAlgorithm.Stock", true, cl);

        Method[] m = classToLoad.getDeclaredMethods();
       Class[] cArg = new Class[1];            
        cArg[0] = String.class;

         Method method = classToLoad.getDeclaredMethod("Stock",cArg);  

         Object result = method.invoke (instance, appl , start , end, 800, 30   );

所以我使用 method.invoke() 来调用构造函数,作为一种方法。我想使用类的设置器(例如 stock.setDate() 等。)我该怎么做?

看过其他帖子并且有人建议使用 Commons BeanUtils 包? Best way of invoking getter by reflection

我想知道 BeanUtils 是否这是最简单的为什么要这样做,或者我是否缺少 javas 类加载器和类对象提供的一些明显功能?

谢谢你们!

编辑:更多信息。 - 添加一些上下文。

上下文是我有一个 PLay 网络服务器,并且我让用户 uoload Jars 到服务器,以便服务器使用上传的 jars 中的类。

服务器将上传的jar包中的类函数在服务器上运行后的返回结果显示在网页上。

【问题讨论】:

  • 为什么只使用反射?它不是子类化一些东西,或者实现一个接口,或者......?
  • 首先,Class.getConstructor 有什么问题?其次,如果您只访问 getter 和 setter,那么 BeanUtils 真的是矫枉过正 - 请参阅我的回答 here
  • 嗨,已编辑帖子以包含更多信息+一些上下文。感谢您回来并提供一些帮助:)

标签: java reflection jar javabeans introspection


【解决方案1】:

假设 java 7. 假设 Stock 是类,testAlgorithm 是包(约定只有小写字母,很少使用'_')。

然后它会这样:

Constructor c =  classToLoad.getContructor(String.class, int.class,
    boolean.class); // Any number of classes for constructor parameters.
Object obj = c.newInstance("", 3, true);

【讨论】:

    【解决方案2】:

    你的意思是这样的吗:

    try{
        Class<?> klass = Class.forName("[classname]");
        object = ([ObjectType]) klass.newInstance();
    
        String methodName = "setAddress"; //for example
        Method method = object.getClass().getMethod(methodName, java.lang.String.class);
    
        method.invoke(object, "[address]");
    } catch(NoSuchMethodException e){
        e.printStackTrace();
    }
    

    * 将 [] 替换为您的值

    【讨论】:

    • 这正是我想要的。谢谢!
    猜你喜欢
    • 2016-03-16
    • 2018-01-02
    • 1970-01-01
    • 2011-04-25
    • 2013-01-24
    • 2013-01-02
    • 2011-11-14
    • 2016-03-04
    • 2017-06-14
    相关资源
    最近更新 更多