Java反射机制在实际开发中的用法

来源:互联网 发布:centos怎么用root登录 编辑:程序博客网 时间:2024/05/22 17:34
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
一般情况下,如果我们要调用一个对象的方法或者属性,程序员需要先获得这个对象有哪些方法或者属性;反射就是程序员不需要提前知道有哪些属性或者方法,可以由程序自己查询和判断调用哪一个属性或者方法。
简而言之,反射是被动获取信息的一种方式。

具体用法如下:
1 创建一个学生类Student
public class Student {public String name;public String tell;public String address;private char sex;public void eat(){System.out.println(name+"----------"+"吃苹果");}public Student() {super();}public Student(String name, String tell, String address, char sex) {super();this.name = name;this.tell = tell;this.address = address;this.sex = sex;}public void show(String name,String tell,String address){System.out.println(name+"---"+tell+"---"+address);}}

2 在main方法中调用该类
public static void main(String[] args) {Class clazz = Student.class;//获取所有的属性(包括私有)Field[] fds = clazz.getDeclaredFields();for(Field f:fds){System.out.println(f.getName());System.out.println(f.getModifiers());System.out.println("------------------");}System.out.println("==================");//获取所有的方法Method[] method = clazz.getDeclaredMethods();for(Method m:method){System.out.println(m.getName());System.out.println(m.getReturnType());System.out.println(m.getModifiers());System.out.println(m.getParameterCount());Class[] c = m.getParameterTypes();for(int i=0;i<m.getParameterCount();i++){System.out.println(c[i]);}System.out.println("-----------------------");}System.out.println("===========================");try {Field field = clazz.getField("name");System.out.println(field.getModifiers());Method m = clazz.getMethod("eat");Object obj = clazz.newInstance();field.set(obj, "XXXXX");m.invoke(obj);} catch (NoSuchFieldException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SecurityException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (NoSuchMethodException 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 (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InvocationTargetException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
另外一种加载该类的方法如下
 public static void main( String[] args )    {        try {Class clazz = Class.forName("reflect.Student");//获取当前类的所有公有属性Field[] field = clazz.getFields();for(Field f:field){System.out.println(f.getName());//属性名System.out.println(f.getModifiers());//属性修饰符 1:公有 2:私有System.out.println(f.getType());//属性类型System.out.println("--------------------");}System.out.println("==========================");//获取所有的公有方法Method[] methods = clazz.getMethods();for(Method m:methods){System.out.println(m.getName());//方法名System.out.println(m.getReturnType());//方法返回类型System.out.println(m.getParameterCount());//方法参数个数System.out.println("-----------------------");}System.out.println("===========================");//获取所有的构造方法Constructor[] cttrs = clazz.getConstructors();for(Constructor cttr:cttrs){System.out.println(cttr.getName());//构造方法名System.out.println(cttr.getParameterCount());//构造方法参数个数Class[] c = cttr.getParameterTypes();//参数类型for(int i=0;i<cttr.getParameterCount();i++){System.out.println(c[i]);}System.out.println("----------------");}System.out.println("==========================");} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}    }



0 0
原创粉丝点击