java 反射 案例
2016-11-01 12:49
162 查看
测试类Person:
package com.ideal.test; public class Person { public int name; public int age; public Person(int name, int age) { this.name = name; this.age = age; } public Person() { } public int getName() { return name; } public void setName(int name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void getStr() { System.out.println("测试获取方法."); } }
TestReflect类:
<pre name="code" class="java">package com.ideal.test; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; /** * * @author XHL * */ public class TestReflect { @SuppressWarnings("rawtypes") public static void main(String[] args) throws IllegalArgumentException, InvocationTargetException, NoSuchFieldException, SecurityException, IllegalAccessException, InstantiationException, NoSuchMethodException, ClassNotFoundException { //第一获取类型的方式 Class c1 = Person.class; //第二种 Class c2 = Class.forName("com.ideal.test.Person"); //第三种 Person p = new Person(); p.setAge(18); //p.setName("XHL"); Class c3 = p.getClass(); //创建的新对象 Person PersonXue = (Person)c3.newInstance(); PersonXue.setAge(50); PersonXue.setName(100); //获取Person类的getStr()方法 Method method = c3.getMethod("getStr"); //调用该该方法invoke为可变参数,第一参数为对象,后面的参数为 该方法参数 method.invoke(PersonXue); //获取修饰符 和类名 System.out.println(Modifier.toString(c3.getModifiers()) + " class " + c3.getSimpleName()); //获取所有方法名 Method[] methods = c3.getMethods(); for (Method meth : methods) { System.out.println("method" + meth.getName()); } // 获取所有属性 Field[] declaredFields = c3.getDeclaredFields(); for (Field field : declaredFields) { //设置些属性是可以访问的 field.setAccessible(true); //获取属性的值 Object object = field.get(PersonXue); //获取属性名 System.out.println(field.getName()); //输出属性值 System.out.println(object); } //指定获取单一的属性 Field fieldF = c3.getDeclaredField("age"); //设置这些书属性是可以访问的 fieldF.setAccessible(true); //重新赋值 fieldF.set(PersonXue, 100); System.out.println(PersonXue.getAge()); //getDeclaredFields()获得某个类的所有申明的字段,即包括public、private和proteced,但是不包括父类的申明字段。 Field[] declaredFieldss = c3.getDeclaredFields(); for (Field field : declaredFieldss) { System.out.println("0:" + field.getName()); } //getFields()获得某个类的所有的公共(public)的字段,包括父类。 Field[] fields = c3.getFields(); for (Field field : fields) { System.out.println("1:" + field.getName()); } //同样类似的还有getConstructors()和getDeclaredConstructors(),getMethods()和getDeclaredMethods()。 } }