Java的反射机制

来源:互联网 发布:ubuntu命令模式 编辑:程序博客网 时间:2024/06/03 18:35

Java的反射机制

什么是反射

  • JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制

如何使用

  • Person 类
public class Person {public String name;  //字段或成员变量private int age;public final String password = "123";  //字段或成员变量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;}public Person(){//System.out.println("person!!!!!");}public Person(String name){System.out.println(name);}private Person(int name){System.out.println(name);}public void eat(){System.out.println("eat!!!!");}public void run(String address){System.out.println("跑到" + address);}public void run(String address,int num[],String ss[]){System.out.println("跑到" + address + "," + num);}public String test(String str){return str + "aaaa";}private String test2(String str){return str + "aaaa";}public static String test3(String str){return str + "aaaa";}public static void main(String[] args) {System.out.println(args[0]);}}
  • 加载字节码的三种方法(获取类)
//第一种Class clazz1 = Class.forName("cn.csx.reflect.Person");//第二种Class clazz2 = Person.class;//第三种Class clazz3 = new Person().getClass();//创建对象Person p = (Person) clazz1.newInstance();
  • 利用Constructor创建对象

反射类无参的构造方法

//反射类无参的构造方法@Testpublic void test1() throws ClassNotFoundException,    NoSuchMethodException, InstantiationException,    IllegalAccessException, InvocationTargetException {    Class clazz = Class.forName("cn.csx.reflect.Person");    Constructor c = clazz.getConstructor(null);    Object obj = c.newInstance(null);    System.out.println(obj);}

反射类有参的构造方法:public Person(String name)

//反射类有参的构造方法:public Person(String name)@Testpublic void test2() throws ClassNotFoundException,NoSuchMethodException, InstantiationException,IllegalAccessException, InvocationTargetException {Class clazz = Class.forName("cn.csx.reflect.Person");Constructor c = clazz.getConstructor(String.class);Person p = (Person) c.newInstance("flx");System.out.println(p);}

反射类私有的、有参的构造方法:private Person(int name)(暴力反射)

//反射类私有的、有参的构造方法:private Person(int name)@Testpublic void test3() throws ClassNotFoundException,NoSuchMethodException, InstantiationException,IllegalAccessException, InvocationTargetException {Class clazz = Class.forName("cn.csx.reflect.Person");Constructor c = clazz.getDeclaredConstructor(int.class);c.setAccessible(true);//暴力反射Person p = (Person) c.newInstance(1);System.out.println(p);}

反射方法

public class Demo3 {//反射方法//反射:public void eat()@Testpublic void test1() throws Exception{Person p = new Person();  //Class clazz = Class.forName("cn.csx.reflect.Person");  //完整名称Method method = clazz.getMethod("eat", null);  //eatmethod.invoke(p, null);  //eat}//反射:run(String address){@Testpublic void test2() throws Exception{Person p = new Person();  //Class clazz = Class.forName("cn.csx.reflect.Person");  //完整名称Method method = clazz.getMethod("run", String.class);method.invoke(p, "北京");}//反射:public void run(String address,int num[],String ss[]){@Testpublic void test3() throws Exception{Person p = new Person();  //Class clazz = Class.forName("cn.csx.reflect.Person");  //完整名称Method method = clazz.getMethod("run", String.class,int[].class,String[].class);method.invoke(p, "上海",new int[]{1,2},new String[]{"1","2"});}//反射:public String test(String str) (带返回值)@Testpublic void test4() throws Exception{Person p = new Person();  //Class clazz = Class.forName("cn.csx.reflect.Person");  //完整名称Method method = clazz.getMethod("test", String.class);String result = (String) method.invoke(p, "xxxx");System.out.println(result);}//反射:private String test2(String str)  私有方法@Testpublic void test5() throws Exception{Person p = new Person();  //Class clazz = Class.forName("cn.csx.reflect.Person");  //完整名称Method method = clazz.getDeclaredMethod("test2", String.class);method.setAccessible(true);method.invoke(p, "");}//反射:public static String test3(String str){ 静态方法@Testpublic void test6() throws Exception{Class clazz = Class.forName("cn.csx.reflect.Person");  //完整名称Method method = clazz.getMethod("test3", String.class);String result = (String) method.invoke(null, "aaa");System.out.println(result);}//反射:public static void main(String[] args) {  反射main方法  //通过反射调用带数组的方法,要注意处理@Testpublic void test7() throws Exception{Class clazz = Class.forName("cn.csx.reflect.Person");  //完整名称Method method = clazz.getMethod("main", String[].class);method.invoke(null, (Object)new String[]{"1","2"});//main(String args[])//method.invoke(null, new Object[]{new String[]{"1","2"}});//main(String args[])//public Object invoke(Object obj, Object... args)  //jdk1.5//public Object invoke(Object obj, Object[] args)  //jdk1.4//public void run(String name,String password)  //method.invoke(p,new Object[]{"flx,123"})//1.4//method.invoke(p,"flx","123");}}

反射类的字段

public class Demo4 {/**反射类的字段 * @param args * @throws Exception  *///反射:public String name; @Testpublic void test1() throws Exception{Person p = new Person();Class clazz = Class.forName("cn.csx.reflect.Person");Field f = clazz.getField("name");  //namef.set(p, "flx");System.out.println(p.getName());}//反射:public String name; @Testpublic void test2() throws Exception{Person p = new Person();p.setName("xxx");Class clazz = Class.forName("cn.csx.reflect.Person");Field f = clazz.getField("name");  //nameString result = (String) f.get(p);System.out.println(result);}//反射:public final String password = "";  //字段或成员变量@Testpublic void test3() throws Exception{Person p = new Person();Class clazz = Class.forName("cn.csx.reflect.Person");Field f = clazz.getField("password");  //nameString result = (String)f.get(p);System.out.println(result);}//反射:private int age; 私有字段@Testpublic void test4() throws Exception{Person p = new Person();Class clazz = Class.forName("cn.csx.reflect.Person");Field f = clazz.getDeclaredField("age");f.setAccessible(true);f.set(p, 123);int result = (Integer) f.get(p);System.out.println(result);}}
0 0