还不存在的类–即我们需要使用反射来使用的类
Person类:
package com.qf.demo4; public class Person { private String name; public int age; static int weight; int male; protected int num; public Person(String name, int age, int weight) { this.name = name; this.age = age; this.weight = weight; System.out.println("有参数的构造方法"); } public Person() { System.out.println("无参数的构造方法"); } public void eat() { System.out.println("吃"); } public void drink(String type) { System.out.println("喝" + type); } public String sleep() { System.out.println("睡"); return "呵呵"; } private void play() { System.out.println("玩"); } public static void hehe() { System.out.println("heheheheh"); } @Override public String toString() { return "Person [name=" + name + ", age=" + age + ",weight = "+weight+"]"; } }演示代码:
Test1:创建Class对象
package com.qf.demo4; import com.qf.demo.Person; /** * 每一个类只有一个class 对象 * com.qf.demo.Person 包名+类名 全限定名 * @author Administrator * */ public class Test { public static void main(String[] args) { // 创建Class 对象 // 第一种方式:类.class Class class1 = Person.class; System.out.println(class1.hashCode()); // 第二种方式:创建类的对象;然后--对象.getClass() Person person = new Person(); Class class2 = person.getClass(); System.out.println(class2.hashCode()); // 第三种方式:使用forname方法,参数为相对于本工程的地址 try { Class class3 = Class.forName("com.qf.demo.Person"); System.out.println(class3.hashCode()); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }Test2:创建Constructor对象,并创建Person类(还没有的类)对象
package com.qf.demo4; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; public class Test2 { public static void main(String[] args) { try { Class class1 = Class.forName("com.qf.demo4.Person"); Constructor[] constructors = class1.getConstructors(); for (Constructor constructor : constructors) { System.out.println(constructor); } // 1 通过构造方法创建 Perosn对象 Constructor constructor = class1.getConstructor(null);// 得到无参的构造方法 Person person = (Person) constructor.newInstance(null); System.out.println(person); // 2 利用有参数的构造方法创建对象 Constructor constructor2 = class1.getConstructor(String.class,int.class,int.class); Person person2 = (Person) constructor2.newInstance("张三",5,9); System.out.println(person2); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }Test3:获取方法,以及调用方法
package com.qf.demo4; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class Test3 { public static void main(String[] args) { try { Class class1 = Class.forName("com.qf.demo4.Person"); // 得到构造方法 Constructor constructor = class1.getConstructor(null); Object object = constructor.newInstance(null); Method[] methods = class1.getMethods();// 得到本类和父类的非私有的方法 Method[] methods2 = class1.getDeclaredMethods();// 得到本类中声明的所有的方法(包括私有) // 得到 无参 无返回值的 方法并且调用 Method method = class1.getMethod("eat", null); // 调用方法的对象 实际参数 method.invoke(object, null);// 是哪个方法被调用 // 调用 有参数 无返回值的方法 Method method2 = class1.getMethod("drink", String.class); method2.invoke(object, "水"); // 有返回值的 Method method3 = class1.getMethod("sleep", null); Object object2 = method3.invoke(object, null);// invoke方法的返回值就是调用的方法的返回值 System.out.println(object2); // 得到静态的方法 Method method4 = class1.getMethod("hehe", null); method4.invoke(null, null);// 静态方法不需要传递对象 直接写null // 私有的 私有的方法 必须用 getDeclaredMethod 才能得到 Method method5 = class1.getDeclaredMethod("play", null); method5.setAccessible(true);// 私有方法默认没有权限调用,必须单独设定调用权限 method5.invoke(object, null); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }反射定义:http://blog.csdn.net/baidu_37107022/article/details/71234940
