public class Person { private String name; private int age; public Person(String name,int age){ this.name = name; this.age = age; } public Person(){ } public String getName(){ return name; } public int getAge(){ return age; } public void setName(String name){ this.name = name; } public void setAge(int age){ this.age = age; } private void test(String name,int age){ this.name = name; this.age = age; System.out.println("反射机制操作private方法得到的名字:" + name + ",年龄:" + age); } } class CreateObject{ /* *反射机制是指:把java类中的各种成分映射成相应的java类,然后可以获取这个类的所有信息 */ public static void createObj1() throws Exception{ Class classType = CLass.forName("shiliu.Person"); Object obj = classType.newInstance(); System.out.println("使用反射机制创建的对象是否是Person类的对象:" + (obj instanceof Person)); } /* *创建带有构造参数的对象的时候需要另一种方式: *1.先获取操作类的class对象的字节码 *2.使用class对象的getConstructor(parameterTypes)方法获取该对象的构造方法的对象 *3.使用构造方法的对象的newInstance(initargs)方法可以实例化一个对象 */ public static void createObj2() throws Exception{ Class classType = Person.class; Constructor<Person> con = classType.getConstuctor(String.class,int.class); Object obj = con.newInstance("niubi",22); System.out.println("使用Constructor对象的newInstance方法创建对象的信息,名字:"+((Person) obj).getName() +" 年龄:" + ((Person) obj).getAge()); System.out.println("使用Constructor对象的newInstance方法创建的对象是否是Person类的对象:" + (obj instanceof Person)); } /* *操作方法包括private方法 *1.首先获取操作类的class对象 *2.通过class对象的getMethod方法获取要操作的方法的Method对象(第一个参数是方法名,第二个是参数类型) *3.调用Method的invoke方法(第一个参数是该方法属于的类对象,第二个是具体参数) *4.当方法被private修饰时,首先要调用getDeclaredMethod方法获取要操作的方法的Method对象,再通过setAccessible方法获得操作权限 *5.对private字段的操作,要调用getDeclaredFiled方法 */ public static void methodDo() throws Exception{ Person p = new Person(); Class classType = Person.class; Method method = classType.getMethod("setName",String.class); method.invoke(p,"shiliu"); System.out.println("使用反射操作setName方法后,Person对象的name值是:" + p.getName()); Method method2 = classType.getDeclaredMethod("test",new Class[]{String.class,int.class}); method2.setAccessible(true); method2.invoke(p,new Object[]{"liu",20}); } public static void main(String args[]) throws Exception{ new CreateObject().createObj1(); new CreateObject().createObj2(); new CreateObject().methodDo(); } } 结果: 使用反射机制创建的对象时候是Person类的对象:true 使用Constructor对象的newInstance方法创建对象的信息,名字:niubi 年龄:22 使用Constructor对象的newInstance方法创建的对象是否是Person类的对象:true 使用反射操作setName方法后,Person对象的name值是:shiliu 反射机制操作private方法得到的名字:liu,年龄:20
呆呆和槑槑
2017-04-22 22:27