Java反射
来源:互联网 发布:电脑农村淘宝 编辑:程序博客网 时间:2024/05/21 19:21
一.前言
最近在开发中用到了反射,但是由于之前很少用到,所以又找了一些资料,在晚上看到了一篇不错的博客,总结的很全面。
转自:http://blog.csdn.net/u011068702/article/details/49863931
二.正文
1.获取Class对象(一共有是3种方式):
1)通过类名.class方式获得:
Class<?> cType = ClassName.class;
2)通过Class.forName()方法获得:
Class<?> cType = Class.forName("类全名");
3)通过对象名.getClass()方法获取:
Class<?> cType3 = objName.getClass();
三种方式的区别:
三种方式均能够获得Class对象,区别是方法一不执行静态块和动态构造块,方法二执行静态块、不执行动态构造块,方法三需要创建对象,静态块和动态构造块均会执行。
注意:静态块仅在类加载时执行一次,若类已加载便不再重复执行;而动态构造块在每次new对象时均会执行。
2.获取实现接口
Class<?> inters[] = c.getInterfaces(); for(int i=0;i<inters.length;i++){ System.out.print(inters[i].getName()+" "); //getName()方法为取得接口名称; }
3.获取父类
Class<?> superClass = c.getSuperclass(); //获得父类 String name = superClass.getName(); //获得父类名称
4.获取构造方法
Constructor cons[] = c.getConstructors(); //获得公开的构造方法 Constructor dcons[] = c.getDeclaredConstructors(); //获得全部构造方法 String modifier = Modifier.toString(cons[i].getModifiers()); //获得访问权限 String name = cons[i].getName(); //获得构造方法名称 Class<?> params[] = cons[i].getParameterTypes(); //获得参数类型对象
5.获取方法Method
Method ms[] = c.getMethods(); //返回公共的全部方法,包括继承方法 Method dms[] = c.getDeclaredMethods(); //返回本类全部方法,不包括继承的方法 Class<?> rt = ms[i].getReturnType(); Class<?>params[] = ms[i].getParameterTypes(); String name = ms[i].getName(); String modifier = Modifier.toString(ms[i].getModifiers()); Class<?>ex[] = ms[i].getExceptionTypes(); //获得异常 String name = ex[i].getName(); //获得异常名称
6.获取字段Field
Field fs[] = c.getFields(); //获得公共属性,包括继承属性 Field dfs[] = c.getDeclaredFields(); // 获得本类全部属性 Class<?> type = fs[i].getType(); //获得属性的类型对象 String name = fs[i].getName(); //获得属性的名称 String modifier = Modifier.toString(fs[i].getModifiers());
7.通过反射创建一个对象
(1) Class<?> c = Class.forName("Person"); Person p = (Person)c.newInstance(); (2) Constructor con = c1.getConstructor(Class....param); Object obj = con.newInstance(Object obj); //根据构造函数创建一个实例 Class c = Class.forName("Person"); Constructor<?> cons[] = c.getConstructors(); Person p = (Person)cons[0].newInstance("xiazdong",15); 注:如果调用的构造函数为私有,则需要c.setAccessible(true);
8.调用特定方法
Method m = c1.getMethod("funcname",Class<?>...c); //funcname表示调用方法的名称,c表示参数的Class对象例如:Method m = c1.getMethod("fun",String.class,int.class); 表示调用fun(String,int);函数
Object obj = m.invoke(c1.newInstance(),"xiazdong",20); //如果有返回值,则invoke函数返回;
注:如果是调用静态的方法,则不需要设置对象;
Object obj = m.invoke(null,"xiazdong");
注:如果参数中有数组,比如 public static void main(String[]args); 则:
Method m = c1.getMethod("main",String[].class);
m.invoke(null,(Object)new String[]{"aa","bb"});是对的;
m.invoke(null,new String[]{"aa","bb"}); 会调用 main(String,String);函数;
9.调用特定属性
Field f = c1.getDeclaredField("name"); //返回name属性f.setAccessible(true); //私有属性可见String name = (String)f.get(Object obj); //返回obj对象的name属性的值f.set(Object obj,String n); //设置obj对象的name属性为n值;
10.操作数组
int tmp[] = {1,2,3};Class<?> c = tmp.getClass().getComponentType();Array.getLength(tmp); //tmp数组的长度c.getName(); //获得数组类型名称Array.get(Object obj,int index); //获得obj数组的index索引的数值Array.set(Object obj,int index,VALUE); //设置obj数组的index索引的数值为value;Object obj = Array.newInstance(c,length); //c为数组的类型,length为数组的长度;obj为返回的数组对象;
三.例子
import java.lang.reflect.*; public class GetMethodDemo01{ public static void main(String args[])throws Exception{ Class<?> c1 = Class.forName("Person"); Method m = c1.getMethod("sayHello"); m.invoke(c1.newInstance()); Method m2 = c1.getMethod("sayHello2",String.class,int.class); String str = (String)m2.invoke(c1.newInstance(),"xiazdong",123); System.out.println(str); Field nameField = c1.getDeclaredField("name"); Field ageField = c1.getDeclaredField("age"); nameField.setAccessible(true); ageField.setAccessible(true); Person obj = (Person)c1.newInstance(); obj.setName("xzdong"); obj.setAge(12); System.out.println(nameField.get(obj)); System.out.println(ageField.get(obj)); Method setName = c1.getMethod("setName",String.class); setName.invoke(obj,"changed"); Method getName = c1.getMethod("getName"); System.out.println(getName.invoke(obj)); int tmp[] = {1,2,3}; Class<?> c3 = tmp.getClass().getComponentType(); System.out.println(c3.getName()); System.out.println("第一个数:"+Array.get(tmp,0)); Array.set(tmp,0,5); System.out.println("第一个数:"+Array.get(tmp,0)); Object arr = Array.newInstance(c3,5); System.arraycopy(tmp,0,arr,0,Array.getLength(tmp)); System.out.println(Array.get(arr,2)); System.out.println(Array.get(arr,3)); } }
import java.lang.reflect.*; public class GetMethodDemo01{ public static void main(String args[])throws Exception{ Class<?> c1 = Class.forName("Person"); Method m = c1.getMethod("sayHello"); m.invoke(c1.newInstance()); Method m2 = c1.getMethod("sayHello2",String.class,int.class); String str = (String)m2.invoke(c1.newInstance(),"xiazdong",123); System.out.println(str); Field nameField = c1.getDeclaredField("name"); Field ageField = c1.getDeclaredField("age"); nameField.setAccessible(true); ageField.setAccessible(true); Person obj = (Person)c1.newInstance(); obj.setName("xzdong"); obj.setAge(12); System.out.println(nameField.get(obj)); System.out.println(ageField.get(obj)); Method setName = c1.getMethod("setName",String.class); setName.invoke(obj,"changed"); Method getName = c1.getMethod("getName"); System.out.println(getName.invoke(obj)); int tmp[] = {1,2,3}; Class<?> c3 = tmp.getClass().getComponentType(); System.out.println(c3.getName()); System.out.println("第一个数:"+Array.get(tmp,0)); Array.set(tmp,0,5); System.out.println("第一个数:"+Array.get(tmp,0)); Object arr = Array.newInstance(c3,5); System.arraycopy(tmp,0,arr,0,Array.getLength(tmp)); System.out.println(Array.get(arr,2)); System.out.println(Array.get(arr,3)); } }
import java.lang.reflect.*; interface China{ public static final String NAME = "CHINA"; public int AGE = 60; public void sayHello(); public String sayHello2(String name,int age); } class Person implements China{ private String name; private int age; public String getName(){ return name; } public void setName(String name){ this.name = name; } public int getAge(){ return age; } public void setAge(int age){ this.age = age; } public void sayHello(){ System.out.println(NAME+" "+AGE); } public String sayHello2(String name,int age){ return name+" "+age; } }
阅读全文
0 0
- 【反射】JAVA反射机制
- JAVA 反射
- java 反射
- Java反射
- java反射
- java反射
- JAVA反射
- java 反射
- Java 反射
- java 反射
- Java反射
- java反射
- JAVA 反射
- java 反射
- Java反射
- java反射
- java 反射
- java 反射
- Spring事务异常回滚失败原因,在事务处理层捕获异常不抛出就不会回滚
- android studio中CMake的简单使用
- 遇到http post返回xml 带有转义字符
- 设计模式之个人总结
- ADB命令详解
- Java反射
- Tensorflow09-saver
- 了解JMS及MQ
- qt中QTableWidget的一些补充用法
- [FAQ10781]如何开启与关闭adb 的认证机制(google adb secure) (adb RSA 指纹认证)
- iOS第三方库汇总
- 17.Sentinel
- vmalloc size分析
- 滚动加载图片(懒加载)实现原理