java反射技术
来源:互联网 发布:windows日志 u盘 编辑:程序博客网 时间:2024/06/08 01:59
一、概述
一个类有多个组成部分,例如:成员变量、成员方法、构造方法等。
反射就是加载类,并解剖出类的各个组成部分。
二、加载类
java中有一个Class类代表某一个类的字节码
方式一
Class clazz = Class.forName("cn.wzk.reflect.Person");
方式二
Class clazz = Person.Class;
方式三
Class clazz = new Person().getClass();
三、解剖类
1.反射类的字段
class Person{ public String name; private int age; public void show(){ System.out.println(this.name); System.out.println(this.age); } //构造方法 public Person(){ System.out.println("无参构造方法。。。"); } public Person(String name){ System.out.println("name :一个参数的构造函数。。。"); } public Person(String name,int age){ System.out.println("name,age : 两个参数的构造函数。。。。"); } private Person(List list){ System.out.println("List : 私有构造函数。。。。。"); } //成员方法 public void method1(){ System.out.println("method1........"); } public void method1(String name,int age){ System.out.println(name+"------"+age); } public String method1(String name,int[] age){ return name; } public static void method1(int num){ System.out.println(num); } private void method1(InputStream is){ System.out.println(is); }}
Person p = new Person();Class clazz= Class.forName("cn.wzk.reflect.Person");Field name= clazz.getField("name");name.set(p, "哈哈");Field age = clazz.getDeclaredField("age");age.setAccessible(true);age.set(p,20);p.show();
2.反射类的构造方法
/** * 反射构造函数:public Person() */ @Test public void test2() throws Exception{ Class clazz = Class.forName("cn.wzk.reflect.Person"); Constructor c = clazz.getConstructor(); Person p = (Person)c.newInstance(); System.out.println(p.name); } /** * 反射构造函数:public Person(String name) * @throws Exception */ @Test public void test3() throws Exception{ Class clazz = Class.forName("cn.wzk.reflect.Person"); Constructor c = clazz.getConstructor(String.class); Person p = (Person)c.newInstance("小红"); } /** * 反射构造函数:public Person(String name,int age) * @throws Exception */ @Test public void test4() throws Exception{ Class clazz = Class.forName("cn.wzk.reflect.Person"); Constructor c = clazz.getConstructor(String.class,int.class); Person p =(Person)c.newInstance("Mike",20); } /** * 反射构造函数:private Person(List list) * @throws Exception */ @Test public void test5() throws Exception{ Class clazz = Class.forName("cn.wzk.reflect.Person"); Constructor c = clazz.getDeclaredConstructor(List.class); c.setAccessible(true); Person p = (Person)c.newInstance(new ArrayList()); }
3.反射类的成员方法
/** * 反射成员方法:public void method1() * @throws Exception */ @Test public void test6() throws Exception{ Class clazz = Class.forName("cn.wzk.reflect.Person"); Person p = (Person)clazz.newInstance(); Method method = clazz.getMethod("method1"); method.invoke(p); } /** * 反射成员方法:public void method1(String name,int age) * @throws Exception */ @Test public void test7() throws Exception{ Class clazz = Class.forName("cn.wzk.reflect.Person"); Person p = (Person)clazz.newInstance(); Method method = clazz.getMethod("method1",String.class,int.class); method.invoke(p,"mike",20); } /** * 反射成员方法:public String method1(String name,int[] age) * @throws Exception */ @Test public void test8() throws Exception{ Class clazz = Class.forName("cn.wzk.reflect.Person"); Person p = (Person)clazz.newInstance(); Method method = clazz.getMethod("method1",String.class,int[].class); Object name =method.invoke(p,"jack",new int[]{1,2,3}); System.out.println(name); } /** * 反射成员方法:public static void method1(int num) * @throws Exception */ @Test public void test9() throws Exception{ Class clazz = Class.forName("cn.wzk.reflect.Person"); Person p = (Person)clazz.newInstance(); Method method = clazz.getMethod("method1",int.class); method.invoke(p,5); } /** * 反射成员方法:private void method1(InputStream is) * @throws Exception */ @Test public void test10() throws Exception{ Class clazz = Class.forName("cn.wzk.reflect.Person"); Person p = (Person)clazz.newInstance(); Method method = clazz.getDeclaredMethod("method1",InputStream.class); method.setAccessible(true); method.invoke(p,new FileOutputStream("a.txt")); }
4.反射类的main方法
public static void main(String[] args) { System.out.println("mian方法。。。。。");}
/** * 反射类的main方法 */ @Test public void test11() throws Exception{ Class clazz = Class.forName("cn.wzk.reflect.Person"); Method method = clazz.getDeclaredMethod("main",String[].class); method.invoke(null, (Object)new String[]{"aa","bb"}); }
注意
对于反射的参数是数组的情况下,会将数组进行拆开(其实是为了兼容jdk1.4)jdk1.4没有可变数组。解决
方式一:
method.invoke(null, (Object)new String[]{"aa","bb"});
方式二:
method.invoke(null,new Object[]{new String[]{"aa","bb"}});
0 0
- java反射技术
- java反射技术(2)
- Java的反射技术
- Java中反射技术
- 反射技术Java原理
- java反射技术
- java的反射技术
- java反射技术
- Java反射技术
- java反射技术
- java反射技术
- java反射代理技术
- java中的反射技术
- java 的反射技术
- java反射技术详解
- java 反射技术
- JAVA反射技术介绍
- java反射技术学习
- 陌兮大魔王带你深入 学习ArrayList(二)
- JZOJ 3366. 【NOI2012】随机数生成器
- 我的科研生活2017-2-9
- springmvc中RESTful的写法
- 聪明人的共性
- java反射技术
- Android JSON数据解析
- Python中遇到"UnicodeDecodeError: ‘gbk’ codec can’t decode bytes in position 2-3: illegal multibyte sequ
- Python大数据处理模块Pandas
- 开发中遇到的Error汇总
- 虚函数
- POJ2106 Boolean Expressions
- RecyclerView源码解析
- 面试题-华为(16年)-字符集合去重-5