java反射
来源:互联网 发布:淘宝网舞鞋 编辑:程序博客网 时间:2024/06/05 12:42
java反射详解(java.lang.reflect)
1.常用基本方法使用
获取Class的三种方法
//第一种方式:Classc1 = Class.forName("类路径");//第二种方式://java中每个类型都有class 属性.Classc2 = Employee.class; //第三种方式://java语言中任何一个java对象都有getClass 方法Employee e = new Employee();Classc3 = e.getClass(); //c3是运行时类 (e的运行时类是Employee)
创建对象:获取类以后我们来创建它的对象,利用newInstance:
Class c =Class.forName("Employee"); //创建此Class 对象所表示的类的一个新实例 Object o = c.newInstance(); //调用了Employee的无参数构造方法.
通过Class类获取成员变量、成员方法、接口、超类、构造方法等
在java.lang.Object 类中定义了getClass()方法,因此对于任意一个Java对象,都可以通过此方法获得对象的类型。Class类是Reflection API 中的核心类,它有以下方法
getName():获得类的完整名字。
getFields():获得类的public类型的属性。
getDeclaredFields():获得类的所有属性。
getMethods():获得类的public类型的方法。
getDeclaredMethods():获得类的所有方法。
getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。
getConstructors():获得类的public类型的构造方法。
getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。
newInstance():通过类的不带参数的构造方法创建这个类的一个对象。
成员变量为private,故必须操作:Field.setAccessible(true); 获取访问权限
2.反射事列
通过反射动态给属性赋值
package test;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStreamReader;import java.lang.reflect.Field;import java.util.ArrayList;import java.util.List;/** * * @auther SHDY * */public class Test { /** * * @designer li.yiyong 2015-2-11 * @developer li.yiyong 2015-2-11 * @modified by * @param args void */ public static void main(String[] args) { File file = new File("C:\\Users\\SHDY\\Desktop\\test.txt"); String id = "id"; String name = "name"; String age = "age"; List<String> list1 = new ArrayList<String>(); list1.add(id); list1.add(name); list1.add(age); List<String> list2 = new ArrayList<String>(); list2.add(id); list2.add(age); list2.add(name); List<String> list3 = new ArrayList<String>(); list3.add(name); list3.add(id); list3.add(age); List<String> list4 = new ArrayList<String>(); list4.add(id); list4.add(age); list4.add(name); List<List<String>> list = new ArrayList<List<String>>(); list.add(list1); list.add(list2); list.add(list3); list.add(list4); try { FileInputStream fis = new FileInputStream(file); InputStreamReader isr = new InputStreamReader(fis,"gbk"); BufferedReader reader = new BufferedReader(isr); int num = 0; String str = null; Student student = null; while((str = reader.readLine()) != null){ List<String> params = list.get(num); String[] arr = str.split("\\|"); student = new Student(); for(int i = 0 ;i < params.size();i++){ String attributeName = params.get(i); Field field = student.getClass().getDeclaredField(attributeName); String type = field.getGenericType().toString(); //根据属性类型赋值 if(type.equals("class java.lang.String")){ field.set(student, arr[i]); }else if(type.equals("class java.lang.Integer")){ field.set(student, Integer.parseInt(arr[i])); }else if(type.equals("class java.lang.Long")){ field.set(student, Long.parseLong(arr[i])); } } num++; System.out.println(student); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchFieldException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } } static class Student{ public Long id; public String name; public Integer age; /** * @return the id */ public Long getId() { return id; } /** * @param id the id to set */ public void setId(Long id) { this.id = id; } /** * @return the name */ public String getName() { return name; } /** * @param name the name to set */ public void setName(String name) { this.name = name; } /** * @return the age */ public Integer getAge() { return age; } /** * @param age the age to set */ public void setAge(Integer age) { this.age = age; } /* (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return "Student [id=" + id + ", name=" + name + ", age=" + age + "]"; } }}
test.txt 配置文件内容:
1|小米|12
2|12|李是
刘校长|3|46
4|23|李老师
通过反射动态调用方法
package ref; import java.lang.reflect.Method; public class Methoder { /** * @param args */ public static void main(String[] args) throws Exception { // TODO 自动生成方法存根 Class c = Class.forName("ref.Test"); // Class ptypes[] ={Class.forName("java.lang.String")}; Class types[] =new Class[1]; types[0]=Class.forName("java.lang.String");//方法的参数对应下面的String aa Method m = c.getMethod("sayHello",types );//动态调用sayHello方法 Test t = new Test(); m.invoke(t,"hellojava" );//传给方法的的参数 } }
package ref; class Test{ public void sayHello(String aa){ System.out.println("Test:"+aa); } }
3.反射的应用
1.反射是java的一大亮点,对我们应用程序的开发有着举足轻重的作用,如框架的应用:spring动态代理、Aop、struts绑定赋值、数据库的动态切换、注解的使用...
2.在开发多个相似的功能时,我们可以运用面向对象使用,将多态、反射、配置文件结合起来,尽量做到通过修改配置文件,就可以增加新的功能,提高代码的扩展性。
- 【反射】JAVA反射机制
- JAVA 反射
- java 反射
- Java反射
- java反射
- java反射
- JAVA反射
- java 反射
- Java 反射
- java 反射
- Java反射
- java反射
- JAVA 反射
- java 反射
- Java反射
- java反射
- java 反射
- java 反射
- Mininet: Cannot find required executable controller 问题解决方法
- 自定义标签
- 用截取的部分图像创建新图像--关于cvGetSubRect,cvGetImage的用法
- spring中事务和aop的顺序问题二(配置形式)
- C++字符串的重载
- java反射
- 字符编码笔记:ASCII,Unicode和UTF-8
- 字符串操作-各种字符串格式输出转换
- Android 顶部可以伸缩+头部固定+listview下拉刷新、上拉请求更多
- EditText:文本编辑框
- 你为Windows Server 2003终止支持做好准备了吗?
- 利用arm开发板交叉编译opencv249错误汇总
- js guid
- 为什么你写不好一个快速排序?关于