1、反射简介
Java的反射机制是Java特性之一,反射机制是构建框架技术的基础所在。灵活掌握Java反射机制,对大家以后学习框架技术有很大的帮助。
Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。
2、反射使用示例
2.1创建Person类,代码如下:
package com.xieke.reflect; public class Person { 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; } @Override public String toString() { return "[" + this.name + " " + this.age + "]"; } public Person() { } public Person(String name) { this.name = name; } public Person(int age) { this.age = age; } public Person(String name, int age) { this.age = age; this.name = name; } }
2.2测试代码如下:
package com.xieke.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; /** * 测试Class类 * * @author junhu */ @SuppressWarnings("unused") public class MainClass { public static void main(String[] args) { // testOne(); // testTwo(); // testThree(); // testFour(); // testFive(); } /** * 通过Class获得其他类的所有属性和方法 */ private static void testFive() { Class<?> demo = null; try { demo = Class.forName("com.xieke.reflect.Person"); } catch (Exception e) { e.printStackTrace(); } System.out.println("===============本类属性========================"); // 取得本类的全部属性 Field[] field = demo.getDeclaredFields(); for (int i = 0; i < field.length; i++) { // 权限修饰符 int mo = field[i].getModifiers(); String priv = Modifier.toString(mo); // 属性类型 Class<?> type = field[i].getType(); System.out.println(priv + " " + type.getName() + " " + field[i].getName() + ";"); } System.out.println("===============本类方法========================"); Method method[] = demo.getMethods(); for (int i = 0; i < method.length; ++i) { Class<?> returnType = method[i].getReturnType(); Class<?> para[] = method[i].getParameterTypes(); int temp = method[i].getModifiers(); System.out.print(Modifier.toString(temp) + " "); System.out.print(returnType.getName() + " "); System.out.print(method[i].getName() + " "); System.out.print("("); for (int j = 0; j < para.length; ++j) { System.out.print(para[j].getName() + " " + "arg" + j); if (j < para.length - 1) { System.out.print(","); } } Class<?> exce[] = method[i].getExceptionTypes(); if (exce.length > 0) { System.out.print(") throws "); for (int k = 0; k < exce.length; ++k) { System.out.print(exce[k].getName() + " "); if (k < exce.length - 1) { System.out.print(","); } } } else { System.out.print(")"); } System.out.println(); } } /** * 通过Class调用其他类中的构造函数 */ private static void testFour() { Class<?> demo = null; try { demo = Class.forName("com.xieke.reflect.Person"); } catch (Exception e) { e.printStackTrace(); } Person per1 = null; Person per2 = null; Person per3 = null; Person per4 = null; // 取得全部的构造函数 Constructor<?> cons[] = demo.getConstructors(); try { per1 = (Person) cons[0].newInstance(); per2 = (Person) cons[1].newInstance("xieke"); per3 = (Person) cons[2].newInstance(20); per4 = (Person) cons[3].newInstance("xieke", 20); } catch (Exception e) { e.printStackTrace(); } System.out.println(per1); System.out.println(per2); System.out.println(per3); System.out.println(per4); } /** * 通过Class调用其他类的无参构造实例化对象 */ private static void testThree() { Class<?> demo = null; try { demo = Class.forName("com.xieke.reflect.Person"); } catch (Exception e) { e.printStackTrace(); } Person per = null; try { per = (Person) demo.newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } per.setName("xieke"); per.setAge(22); System.out.println(per); } /** * 通过一个对象获得完整的包名和类名 */ private static void testOne() { Person person = new Person(); System.out.println(person.getClass().getName());// 获得完整的包名和类名 System.out.println(person.getClass().getSimpleName());// 获得类名 } /** * 实例化Class类对象 */ private static void testTwo() { Class<?> class1 = null; Class<?> class2 = null; Class<?> class3 = null; try { // 一般尽量采用这种形式 class1 = Class.forName("com.xieke.reflect.Person"); } catch (Exception e) { e.printStackTrace(); } class2 = new Person().getClass(); class3 = Person.class; System.out.println("类名称 " + class1.getName()); System.out.println("类名称 " + class2.getName()); System.out.println("类名称 " + class3.getName()); } }
3、测试效果自己动手试一试,我就不把测试结果贴出来了,详细代码见我的码云。
相关推荐
从原理讲解反射技术,及其作用,是不可多得的上手教程
(通过反射获取无参构造方法并使用) (通过反射获取带参构造方法并使用) (通过反射获取私有构造方法并使用) (通过反射获取成员变量并使用) (通过反射获取无参无返回值成员方法并使用) (通过反射获取带参带返回值成员...
java基础之反射讲解
解析Java反射技术讲解如何将字符串变成java中的对象
1、JAVA 讲解反射机制,基本使用介绍,原理分析; 1、JAVA 讲解反射机制,基本使用介绍,原理分析; 1、JAVA 讲解反射机制,基本使用介绍,原理分析; 1、JAVA 讲解反射机制,基本使用介绍,原理分析; 1、JAVA 讲解...
这是我自己地java反射机制的总结,在学习饿过程中自己的看法,以及学习的记录,希望能够帮助到大家!
Java反射机制的学习 对java反射机制进行详细的讲解
关于java反射机制的很好的讲解,包括Java的反射机制(Reflection)、Class类、如何获得类的相关信息和运用,并且还有相应的练习,有助于更好地学习java反射机制
在向学生讲解Class.forName()方法的使用时,有时需要扩展讲解为什么这样书写的原理,于是,扩展讲解Java反射技术可以查看被监视类的方法(构造方法和普通方法)、公有属性的功能,以达到封闭功能的效果。该例子使用...
详细讲解了java反射技术,简单易懂,可以很轻松的学习java的反射机制
Java反射机制主要提供了以下功能: l 在运行时判断任意一个对象所属的类; l 在运行时构造任意一个类的对象; l 在运行时判断任意一个类所具有的成员变量和方法; l 在运行时调用任意一个对象的方法; l 生成...
讲解java反射原理,给那些迷惑于java反射的同胞给个分享!
本文档对Java中使用最广的反射进行了深度而让人简单容易理解的解析,附有实例,可供致力于java底层研究的人提供借鉴
Java反射机制剖析。里面有关于Java反射很详细的讲解。
详细地讲解java反射机制 看完基础至少更进一层楼
讲解了JAVA中反射机制,包含例子,代码!对初学者很有用
实例讲解java的反射 实例讲解java的反射
java中关于反射的ppt课程资源,ppt
50页PPT详细讲解了反射与动态代理;强烈推荐。
本文档时关于Java的反射的一个组件Constructor的描述和讲解