反射操作
来源:互联网 发布:单词默写软件 编辑:程序博客网 时间:2024/05/01 11:54
import java.lang.reflect.*;import java.util.Date;public class RefelectTest {/** * 通过反射机制获取类的基本信息(包名,修饰符,类名,基类,实现的接口) */public static void getClassBaseInfo() {try {// 通过String指定要获取那个类的Class,注意,必须是完整的类名,也就是包名+类名格式String className = "com.powernode.refelect.test1.Student";// 获取指定类名的ClassClass claz = Class.forName(className);// 取得包名的信息System.out.println("包名:" + claz.getPackage().getName());// 取得修饰符的信息System.out.println("修饰符:" + Modifier.toString(claz.getModifiers()));// 取得类名的信息(完整的类名)System.out.println("类名:" + claz.getName());// 取得类名的信息(简单的类名)System.out.println("类名:" + claz.getSimpleName());// 取得基类的信息System.out.println("基类:" + claz.getSuperclass().getName());// 取得接口的信息Class[] interfaceClazs = claz.getInterfaces();if (interfaceClazs.length > 0) {System.out.print("实现的接口:");for (Class interfaceClaz : interfaceClazs) {System.out.print(interfaceClaz.getName() + ",");}}} catch (ClassNotFoundException e) {e.printStackTrace();}}/** * 通过反射机制获取类的方法的信息(修饰符,返回类型,方法名称,参数列表,抛出的异常) */public static void getMethodInfo() {try {// 通过String指定要获取那个类的Class,注意,必须是完整的类名,也就是包名+类名格式String className = "com.powernode.refelect.test1.Student";// 获取指定类名的ClassClass claz = Class.forName(className);// 获取方法的信息,claz.getMethods()获取类中的所有的公开的方法的信息(包括继承下来的公开的方法)// Method[] methods = claz.getMethods();// claz.getDeclaredMethods()获取类中声明的所有的方法的信息(包括公开的,保护的,缺省的,私有的,但是没有继承的)Method[] methods = claz.getDeclaredMethods();// 遍历Method的数组for (Method method : methods) {// 从方法上面取得方法的各个信息System.out.print(Modifier.toString(method.getModifiers()) + " ");// 取得方法的返回类型信息System.out.print(method.getReturnType().getName() + " ");// 取得方法名称信息System.out.print(method.getName() + " ");// 获取方法的参数的信息System.out.print("(");Class[] paramClazs = method.getParameterTypes();for (Class paramClaz : paramClazs) {System.out.print(paramClaz.getName() + ",");}System.out.print(")");// 取得异常的信息Class[] exceptionClazs = method.getExceptionTypes();if (exceptionClazs.length > 0) {System.out.print(" throws ");for (Class exceptionClaz : exceptionClazs) {System.out.print(exceptionClaz.getName() + ",");}}System.out.println();}} catch (ClassNotFoundException e) {e.printStackTrace();}}/** * 通过反射机制获取构造方法的信息(修饰符,类名,参数列表,抛出的异常) */public static void getConstructorInfo() {try {// 通过String指定要获取那个类的Class,注意,必须是完整的类名,也就是包名+类名格式String className = "com.powernode.refelect.test1.Student";// 获取指定类名的ClassClass claz = Class.forName(className);// 获取构造方法的信息// claz.getConstructors()获取类中公开的构造方法的信息// Constructor[] cons =claz.getConstructors();// claz.getConstructors()获取类中声明的的构造方法的信息(包括公开的,保护的,私有的,缺省的)Constructor[] cons = claz.getDeclaredConstructors();if (cons.length > 0) {// 遍历每一个构造方法,分别取得构造方法的信息for (Constructor con : cons) {// 取得修饰符的信息System.out.print(Modifier.toString(con.getModifiers())+ " ");// 构造方法名称(类名)System.out.print(con.getName() + " ");// 取得参数的信息System.out.print("(");Class[] paramClazs = con.getParameterTypes();if (paramClazs.length > 0) {for (Class paramClaz : paramClazs) {// System.out.print(paramClaz.getName() + "-" +// paramClaz.getSimpleName() + "," );System.out.print(paramClaz.getSimpleName() + ",");}}System.out.print(") ");// 取得异常的信息Class[] exceptionClazs = con.getExceptionTypes();if (exceptionClazs.length > 0) {System.out.print(" throws ");for (Class exceptionClaz : exceptionClazs) {System.out.print(exceptionClaz.getName() + ",");}}System.out.println();}}} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/** * 通过反射机制创建对象 * * @return */public static Object createObject() {Object obj = null;try {// 通过String指定要获取那个类的Class,注意,必须是完整的类名,也就是包名+类名格式String className = "com.powernode.refelect.test1.Student";// 获取指定类名的ClassClass claz = Class.forName(className);// 通过参数列表,获取指定的构造方法Class[] paramClazs = { String.class, String.class, Sex.class,int.class };Constructor con = claz.getDeclaredConstructor(paramClazs);// 设置con是可以访问的con.setAccessible(true);obj = con.newInstance("张三", "1987-12-8", Sex.男, 178);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SecurityException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (NoSuchMethodException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InvocationTargetException e) {// TODO Auto-generated catch blocke.printStackTrace();}return obj;}/** * 通过反射机制调用类中的方法 */public static void invokeMethod() {// 获取Student类的ClassClass claz = Student.class;try {// Method m1 = claz.getDeclaredMethod("toString1", Integer.class);Method m1 = claz.getDeclaredMethod("toString1", Integer.TYPE);m1.setAccessible(true);// 调用方法,创建对象Object obj = createObject();// "张三", "1987-12-8", Sex.男, 178Object res = m1.invoke(obj, 100);System.out.println(res);} catch (SecurityException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (NoSuchMethodException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InvocationTargetException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static void changeField() {try {Object obj = createObject();Class claz = obj.getClass();// 取得类中的属性,也就是FieldField nameField = claz.getDeclaredField("name");Field sexField = claz.getDeclaredField("sex");Field heightField = claz.getDeclaredField("height");Field birthdayField = claz.getDeclaredField("birthday");nameField.setAccessible(true);sexField.setAccessible(true);heightField.setAccessible(true);birthdayField.setAccessible(true);// 修改属性的值heightField.setInt(obj, 180);nameField.set(obj,"张4");birthdayField.set(obj, new Date());sexField.set(obj, Sex.女);// 取得对象上面的属性int height = heightField.getInt(obj);String name = (String)nameField.get(obj);Sex sex = (Sex)sexField.get(obj);Date birthday = (Date)birthdayField.get(obj);System.out.println(height + "," + name + "," + sex + "," + birthday);} catch (SecurityException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (NoSuchFieldException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static void main(String[] args) {// getClassBaseInfo();// getMethodInfo();// getConstructorInfo();// Object obj = createObject();// System.out.println(obj);//invokeMethod();changeField();}}
0 0
- 反射--操作
- 反射操作
- 通过反射操作对象
- 反射的操作
- java反射常用操作
- 常用反射操作
- iOS 反射操作
- 反射原理及操作
- java反射操作
- 使用反射操作list
- 反射操作工具类
- 反射02:通过反射动态操作类
- 使用反射分发 switch 操作
- BLReflection - 反射常用操作类
- android 反射来操作数据库
- java反射技术常用操作
- 利用反射操作泛型
- 通过反射操作泛型
- 包罗万象的JS功能,配上刚刚发布的CSS简直是完美,没有前端的IT好好看看
- 关于fragment内的监听事件
- Device eth0 does not seem to be present delaying initialization 问题解决办法
- 开发网站需要注意的事项
- 配置tomcat时遇到publishes and runs j2ee and java ee web projects and server configurations to a local tom
- 反射操作
- 基于 jenkins 和 docker 的持续集成平台
- 未来 Web 设计的 7 大趋势
- Magnificent Meatballs - 1247
- Linux学习8_.deb文件和.rpm文件的区别
- Android Textview 阴影效果
- 点击空白隐藏键盘
- oracle 数据库状态查询
- 数据库的链接与SQL语句的使用