java反射机制简单认知
2016-08-05 15:37
344 查看
获取Class对象有三种方式:
1、通过Object类的getClass()方法,例如:
Class c1 = new String("").getClass();
2、通过Class类的静态方法forName()来实现:
Class c2 = Class.forName("MyObject");
3、若果说T是一个已定义的类型的话,在Java中,他的.class文件名:T.class就代表了与其匹配的Class对象
Class c3 = Manager.class;
Class c4 = int.class;
Class类中也存在一些重要的方法:
1、getName()
一个Class对象描述了一个特定类的特定属性,而这个方法就是返回String形式的该类的简要描述。
2、newInstance()
该方法可以根据摸个Class对象产生其对应类的实例。需要强调的是,他调用的时此类的默认构造函数。
MyObject x = new MyObject();
MyObject y = x.getClass().newInstance();
3、getClassLoader()
返回该Class对象对应的类的加载器
4、getSuperClass()
返回某自雷所对应的直接父类所对应的Class对象。
5、isArray()
判定此Class对象所对应的是否是一个数组对象
/**
* 提供关于Java反射的工具
*
* @author QzC
*
*/
public class RelUtils {
/**
* 得到某个对象的公共属性
*
* @param owner
* @param fiedName
* @return
* @throws Exception
*/
public Object getProperty(Object owner, String fiedName) throws Exception {
Class ownerClass = owner.getClass();
Field filed = ownerClass.getField(fiedName);
Object property = filed.get(owner);
return property;
}
/**
* 得到某类的静态公共属性
*
* @param className
* @param filedName
* @return
* @throws Exception
*/
public Object getStaticProperty(String className, String filedName) throws Exception{
Class ownerClass = Class.forName(className);
Field field = ownerClass.getField(filedName);
Object property = field.get(ownerClass);
return property;
}
/**
* 执行某对象的方法
*
* @param owner
* 对象
* @param methodName
* 方法名
* @param args
* 参数
* @return 这个方法的返回值
* @throws Exception
*/
public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception {
Class ownerClass = owner.getClass();
Class[] argsClass = new Class[args.length];
for(int i=0, j=args.length; i<j; i++){
argsClass[i] = args[i].getClass();
}
Method method = ownerClass.getMethod(methodName, argsClass);
return method.invoke(owner, args);
}
/**
* 执行某类的静态方法
*
* @param className
* 类的全类名(包名+类名)
* @param methodName
* 方法名
* @param args
* 参数
* @return 执行方法返回的结果
* @throws Exception
*/
public Object invokeStaticMethod(String className, String methodName, Object[] args) throws Exception {
Class ownerClass = 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 = ownerClass.getMethod(methodName, argsClass);
return method.invoke(null, args);
}
/**
* 新建实例
*
* @param className
* 类名(包名+类名)
* @param args
* 构造函数的参数
* @return
* @throws Exception
*/
public Object newInstatnce(String className, Object[] args) throws Exception {
Class newoneClass = 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 = newoneClass.getConstructor(argsClass);
return cons.newInstance(args);
}
/**
* 某对象是否是该类的实例
*
* @param obj
* 对象
* @param cls
* 类
* @return 如果obj是此类的实例,则返回true
*/
public boolean isInstance(Object obj, Class cls){
return cls.isInstance(obj);
}
/**
* 得到数组中某个元素
*
* @param array
* 数组
* @param index
* 索引
* @return 返回指定数组对象中索引组件的值
*/
public Object getByArry(Object array, int index){
return Array.get(array, index);
}
}
1、通过Object类的getClass()方法,例如:
Class c1 = new String("").getClass();
2、通过Class类的静态方法forName()来实现:
Class c2 = Class.forName("MyObject");
3、若果说T是一个已定义的类型的话,在Java中,他的.class文件名:T.class就代表了与其匹配的Class对象
Class c3 = Manager.class;
Class c4 = int.class;
Class类中也存在一些重要的方法:
1、getName()
一个Class对象描述了一个特定类的特定属性,而这个方法就是返回String形式的该类的简要描述。
2、newInstance()
该方法可以根据摸个Class对象产生其对应类的实例。需要强调的是,他调用的时此类的默认构造函数。
MyObject x = new MyObject();
MyObject y = x.getClass().newInstance();
3、getClassLoader()
返回该Class对象对应的类的加载器
4、getSuperClass()
返回某自雷所对应的直接父类所对应的Class对象。
5、isArray()
判定此Class对象所对应的是否是一个数组对象
/**
* 提供关于Java反射的工具
*
* @author QzC
*
*/
public class RelUtils {
/**
* 得到某个对象的公共属性
*
* @param owner
* @param fiedName
* @return
* @throws Exception
*/
public Object getProperty(Object owner, String fiedName) throws Exception {
Class ownerClass = owner.getClass();
Field filed = ownerClass.getField(fiedName);
Object property = filed.get(owner);
return property;
}
/**
* 得到某类的静态公共属性
*
* @param className
* @param filedName
* @return
* @throws Exception
*/
public Object getStaticProperty(String className, String filedName) throws Exception{
Class ownerClass = Class.forName(className);
Field field = ownerClass.getField(filedName);
Object property = field.get(ownerClass);
return property;
}
/**
* 执行某对象的方法
*
* @param owner
* 对象
* @param methodName
* 方法名
* @param args
* 参数
* @return 这个方法的返回值
* @throws Exception
*/
public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception {
Class ownerClass = owner.getClass();
Class[] argsClass = new Class[args.length];
for(int i=0, j=args.length; i<j; i++){
argsClass[i] = args[i].getClass();
}
Method method = ownerClass.getMethod(methodName, argsClass);
return method.invoke(owner, args);
}
/**
* 执行某类的静态方法
*
* @param className
* 类的全类名(包名+类名)
* @param methodName
* 方法名
* @param args
* 参数
* @return 执行方法返回的结果
* @throws Exception
*/
public Object invokeStaticMethod(String className, String methodName, Object[] args) throws Exception {
Class ownerClass = 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 = ownerClass.getMethod(methodName, argsClass);
return method.invoke(null, args);
}
/**
* 新建实例
*
* @param className
* 类名(包名+类名)
* @param args
* 构造函数的参数
* @return
* @throws Exception
*/
public Object newInstatnce(String className, Object[] args) throws Exception {
Class newoneClass = 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 = newoneClass.getConstructor(argsClass);
return cons.newInstance(args);
}
/**
* 某对象是否是该类的实例
*
* @param obj
* 对象
* @param cls
* 类
* @return 如果obj是此类的实例,则返回true
*/
public boolean isInstance(Object obj, Class cls){
return cls.isInstance(obj);
}
/**
* 得到数组中某个元素
*
* @param array
* 数组
* @param index
* 索引
* @return 返回指定数组对象中索引组件的值
*/
public Object getByArry(Object array, int index){
return Array.get(array, index);
}
}
相关文章推荐
- JDK配置环境变量要点
- java反射拼接方法名动态执行方法实例
- [SpringBoot]构建SpringBoot项目 By Eclipse
- java数据转换error:java.math.BigDecimal cannot be cast to java.lang.Double
- Virtualbox 基于Java的应用
- java对象转成JSON字符串,避免 $ref
- Spring注解@Component、@Repository、@Service、@Controller区别
- JAVA中toString方法的作用
- java POI解析Excel 之数据转换公用方法(推荐)
- 用protobuf进行C#与Java通信
- java并发编程:线程让步
- 深入浅出HashMap原理
- java中的泛型
- Spring 定时任务的配置
- 一个简易的Java多页面队列爬虫程序
- SpringMVC拦截器
- [SpringBoot]SpringBoot开发准备 By Eclipse
- Dubbo服务之启动时检测
- Eclipse/MyEclipse中安装插件lombok.jar
- java 反射 动态调用不同类的静态方法(推荐)