整容说文库 > 程序代码 > 教育资讯

只知道类名字符串(不知路径)如何转换为Class 类型

来源:学生作业帮助网 编辑:整容说文库 时间:2020/12/03 11:39:32 程序代码
只知道类名字符串(不知路径)如何转换为Class 类型程序代码
public static void main(String[] args) {
        CustomerInfo cus = new CustomerInfo();
        cus.setName("aa");
        JSONObject cusstr = JSONObject.fromObject(cus);
    
        String str = "CustomerInfo";
            
        try {        
            Class<?> cl = Class.forName(str);
            JSONObject.toBean(cusstr, cl.getClass());  //这里报错
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    } 



Object net.sf.json.JSONObject.toBean(JSONObject jsonObject, Class beanClass)


错误信息提示如下:
net.sf.json.JSONException: java.lang.SecurityException: Can not make a java.lang.Class constructor accessible
at net.sf.json.JSONObject.toBean(JSONObject.java:302)
at net.sf.json.JSONObject.toBean(JSONObject.java:247)
at com.ruijie.common.util.StringUtils.jsonToEntity(StringUtils.java:85)
at com.ruijie.csc.center.customer.service.impl.CustomerInfoServiceImpl.main(CustomerInfoServiceImpl.java:145)
Caused by: java.lang.SecurityException: Can not make a java.lang.Class constructor accessible
at java.lang.reflect.AccessibleObject.setAccessible0(AccessibleObject.java:118)
at java.lang.reflect.AccessibleObject.setAccessible(AccessibleObject.java:108)
at net.sf.json.util.NewBeanInstanceStrategy$DefaultNewBeanInstanceStrategy.newInstance(NewBeanInstanceStrategy.java:56)
at net.sf.json.JSONObject.toBean(JSONObject.java:296)
... 3 more
Class.forName利用ClassLoader 机制加载类,根据Java规范,任何作为 String 类型参数传递给 ClassLoader 中方法的类名称都必须是一个二进制名称,二进制名称由包名+类名构成,例如:
   "java.lang.String"
   "javax.swing.JSpinner$DefaultEditor"
   "java.security.KeyStore$Builder$FileBuilder$1"
   "java.net.URLClassLoader$3$1"

----------------------
http://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html
需要定义无参构造方法?
楼主CustomerInfo这个类代码中不是已经有了,干嘛还要用Class.forName();
直接用JSONObject.toBean(cusstr, CustomerInfo.class);
引用 2 楼 fudongrifdr 的回复:
需要定义无参构造方法?
  
从new CustomerInfo() 说明是有无参构造方法的
引用 3 楼 suciver的回复:
楼主CustomerInfo这个类代码中不是已经有了,干嘛还要用Class.forName();
直接用JSONObject.toBean(cusstr, CustomerInfo.class);


这是测试代码....
我是想测试只知道类名 是否可以转换为Class
引用 1 楼 markcxz的回复:
Class.forName利用ClassLoader 机制加载类,根据Java规范,任何作为 String 类型参数传递给 ClassLoader 中方法的类名称都必须是一个二进制名称,二进制名称由包名+类名构成,例如:
   "java.lang.String"
   "javax.swing.JSpinner$DefaultEditor"
   "java.security.KeyStore$Builder$FileBuilder$1"
   "java.net.URLClassLoader$3$1"


嗯嗯 谢谢哈
看来这种方案是不可行的了...
程序代码