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
- java的反射机制
- Java的反射机制
- Java的反射机制
- Java 的反射机制
- JAVA的反射机制
- Java 的反射机制
- java的反射机制
- Java的反射机制
- Java 的反射机制
- JAVA的反射机制
- Java 的反射机制
- java的反射机制
- java的反射机制
- java的反射机制
- Java的反射机制
- Java的反射机制
- Java的反射机制
- Java的反射机制
- JQuery实现shift键多选
- CDH HUE配置自定义MySql数据库
- CodeForces 597 A. Divisibility(坑,满满的都是坑)
- RTTI介绍
- TCP三次握手和四次挥手协议
- Java的反射机制
- recoder
- POJ 3663 Costume Party(模拟+减枝)
- 安卓中HttpUrlConnection get和post请求方法
- 最大连续子序列和
- markdown
- 51 nod 1268 和为k的组合
- C#设计模式(2)
- NoSql之初识HBase