使用java中的反射机制,我能够动态获取该变量或者对象的类型,获取出的类型是Class类型的,现在我有个问题:比方说,
String name = "MyName"; Class clazz = name.getClass();此时获取了该变量的类型,Object obj = (Object)clazz.getInstance();使用反射创建该类型的变量,使用该方法获取出的类型确实Object,实际上我们做程序的知道他获取出来应该是String类型的,可为了保证代码的通用性,我又不能确定不是所有的变量到底层都是同一个类型的,可我又不想使用Object类型尽享装箱操作,因为Object类型中的方法并不能满足我的需求,我需要知道的是传到底层方法的参数的实际类型是什么,并且能够使用获取的类型进行强制转换,那样我就可以获取出来时精确的类型,有没有办法实现我的这个需求,急急急急急急急急!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
String name = "MyName"; Class clazz = name.getClass();此时获取了该变量的类型,Object obj = (Object)clazz.getInstance();使用反射创建该类型的变量,使用该方法获取出的类型确实Object,实际上我们做程序的知道他获取出来应该是String类型的,可为了保证代码的通用性,我又不能确定不是所有的变量到底层都是同一个类型的,可我又不想使用Object类型尽享装箱操作,因为Object类型中的方法并不能满足我的需求,我需要知道的是传到底层方法的参数的实际类型是什么,并且能够使用获取的类型进行强制转换,那样我就可以获取出来时精确的类型,有没有办法实现我的这个需求,急急急急急急急急!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
实际上我们做程序的知道他获取出来应该是String类型的,可为了保证代码的通用性
---
这个就不明白了,如果你非常肯定它一定是String,则根本没有通用性的问题
如果你的要求是这个obj符合一定的规范,那么通常是使用Interface,在其中定义方法IMyInterface obj = (IMyInterface)clazz.getInstance()这样调用方法就直接可以调用接口中的方法了
如果你想知道它是什么类,obj.getClass()就会返回实际的类名了
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* Java Reflection
* @author closewubq
* @version 1.0
*/public class Reflection {
/**
* 得到某个对象的公共属性
* @param obj
* 某个对象
* @param fieldName
* 属性名称
* @return 该属性对象
* @throws Exception
*
*/
@SuppressWarnings("unchecked")
public Object getField(Object obj, String fieldName) throws Exception {
Class objclass = obj.getClass();
Field field = objclass.getField(fieldName);
Object property = field.get(obj);
return property;
} /**
* 得到某类的静态公共属性
* @param className
* 类名
* @param fieldName
* 属性名称
* @return 该属性对象
* @throws Exception
*/
@SuppressWarnings("unchecked")
public Object getStaticField(String className, String fieldName)
throws Exception {
Class obj = Class.forName(className);
Field field = obj.getField(fieldName);
Object property = field.get(obj);
return property;
}
/**
* 执行某对象方法
* @param obj
* 对象
* @param methodName
* 方法名
* @param args
* 参数
* @return 方法返回值
* @throws Exception
*/
@SuppressWarnings("unchecked")
public Object invokeMethod(Object obj, String methodName, Object[] args)
throws Exception {
Class objClass = obj.getClass();
Class[] argsClass = new Class[args.length];
for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
}
Method method = objClass.getMethod(methodName, argsClass);
return method.invoke(obj, args);
}
/**
* 执行某类的静态方法
* @param className
* 类名
* @param methodName
* 方法名
* @param args
* 参数数组
* @return 执行方法返回的结果
* @throws Exception
*/
@SuppressWarnings("unchecked")
public Object invokeStaticMethod(String className, String methodName,
Object[] args) throws Exception {
Class objclass = Class.forName(className);
Class[] argsClass = new Class[args.length];
for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
}
Method method = objclass.getMethod(methodName, argsClass);
return method.invoke(null, args);
} /**
* 根据类名创建实例
* @param className
* 类名
* @param args
* 构造函数的参数
* @return Object
* 新建的实例
* @throws Exception
*/
@SuppressWarnings("unchecked")
public Object newInstance(String className, Object[] args) throws Exception {
Class objcass = Class.forName(className);
Class[] argsClass = new Class[args.length];
for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
}
Constructor cons = objcass.getConstructor(argsClass);
return cons.newInstance(args); }
/**
* 判断一个对象是不是某个类的实例
* @param obj
* 某个对象
* @param objclass
* 某个类
* @return boolean
* 如果 obj 是此类的实例,则返回 true
*/
@SuppressWarnings("unchecked")
public boolean isInstance(Object obj, Class objclass) {
return objclass.isInstance(obj);
}
}
通过clazz.getSuperClass() == BaseClass.class来确定这个对象类型,再执行具体方法
对象的getClass方法和Class.forName(类的全称),返回的都是该类型的Class类型对象,如果你将二者用==去对比,会返现这两个对象的引用是相等的,原理可能是由于JVM加载类的机制引起的,可能大家误会我的意思了,上面的列子是String name ="ddd"; 我们可以通过name.getClass().getName()获取出的值是java.lang.String也就是String类型的全称,name.getClass()类型返回时String.class,name.getClass().getInstance()使用反射创建String类型的对象,可改返回值去时Object类型的,我有什么办法动态将其转换为对应的类型吗???
List l = new Array(); l.getClass()返回的是java.util.ArrayListString name = "ddd";
name.getClass();这里和name的值,根本没有任何关系,你写"abc"效果是一样的。
Class.forName()是反射中的功能,根本给定一个类的全名,获取这个类
例如Class.forName("java.util.ArrayList");
String name = "java.util.ArrayList";
Class.forName(name);可改返回值去时Object类型的,我有什么办法动态将其转换为对应的类型吗???
---
没有明白第一句话是什么意思
这三个当然都是返回java.lang.String这个类的引用在hiberante中,如果是普通的字段,hibernate会判断应该使用哪个转换类来处理结果集的。
例如一个POJO类中有一个属性int abc,那么hiberante会判断使用IntegerType这个转换类
如果是一对多等关系,那么这个Set也是hibernate创建出的类,它会保留对方的实际类型
例如:一个POJO类A中有一个方法public List<B> getB()那么hibernate创建的List中会记录实际类名为B,当你调用list.get(0)时,hibernate会通过类似于
clz.newInstance()或者Proxy等方法创建出B类的实例。
这三个当然都是返回java.lang.String这个类的引用在hiberante中,如果是普通的字段,hibernate会判断应该使用哪个转换类来处理结果集的。
例如一个POJO类中有一个属性int abc,那么hiberante会判断使用IntegerType这个转换类
如果是一对多等关系,那么这个Set也是hibernate创建出的类,它会保留对方的实际类型
例如:一个POJO类A中有一个方法public List<B> getB()那么hibernate创建的List中会记录实际类名为B,当你调用list.get(0)时,hibernate会通过类似于
clz.newInstance()或者Proxy等方法创建出B类的实例。