java反射
2015-12-13 23:26
453 查看
什么是Class
java中的类用于描述事物的属性和功能
Class类用于描述这些类的共性--->字节码数据
字节码-->创建多个对象
例如:
//类的字节码
Class<?> dateClass1=java.util.Date.class;
//对象所属类的字节码
java.util.Date da=new java.util.Date();
Class<?> dateClass2=da.getClass();
//通过类所在路径加载类的字节码,反射多用这种方法
Class<?> dateClass3= Class.forName("java.util.Date");
九个预定义的Class对象八个基本类型(byte short int char boolean float double lang)和void
总结:
字节码创建类,类创建对象-->通过对象找到类,通过类找到字节码(Class)
基本类型的字节码和引用类型的字节码不是同一个内存地址
int.class==Integer.TYPE;基本数据类型对应的包装类的TYPE属性为基本数据类型的字节码
基本类型的数组的字节码不是基本类型的字节码(用字节码的isPrimitive()方法判断)
判断字节码是不是数组的方法(Class.isArray());
只要在源程序出现的类型都有对应的Class实例对象
反射会消耗程序性能
2.什么是反射
反射就是把java类中的各种成分映射成对应的java类
描述构成类的成分的类:Field,Method,Constructor,Package...
Constructor:构造方法,由Constructor创建一个对象
无参构造方法:
例如:
String str=java.lang.String.class.newInstance();
有参构造方法:
例如:
Constructor con=java.lang.String.class.getConstructor(StringBuffer.class);
String newInstance = (String) con.newInstance(new StringBuffer("hehe"));
Filed:字段的反射
//Person类用于测试
Method 类方法的反射
当uname为null时表示调用静态方法,以后参数为可变长度的方法参数
通过反射,获得方法参数泛型里的参数类型
输出:
class java.util.Vector
class com.test.Person
欢迎留言交流
java中的类用于描述事物的属性和功能
Class类用于描述这些类的共性--->字节码数据
字节码-->创建多个对象
例如:
//类的字节码
Class<?> dateClass1=java.util.Date.class;
//对象所属类的字节码
java.util.Date da=new java.util.Date();
Class<?> dateClass2=da.getClass();
//通过类所在路径加载类的字节码,反射多用这种方法
Class<?> dateClass3= Class.forName("java.util.Date");
九个预定义的Class对象八个基本类型(byte short int char boolean float double lang)和void
总结:
字节码创建类,类创建对象-->通过对象找到类,通过类找到字节码(Class)
基本类型的字节码和引用类型的字节码不是同一个内存地址
int.class==Integer.TYPE;基本数据类型对应的包装类的TYPE属性为基本数据类型的字节码
基本类型的数组的字节码不是基本类型的字节码(用字节码的isPrimitive()方法判断)
判断字节码是不是数组的方法(Class.isArray());
只要在源程序出现的类型都有对应的Class实例对象
反射会消耗程序性能
2.什么是反射
反射就是把java类中的各种成分映射成对应的java类
描述构成类的成分的类:Field,Method,Constructor,Package...
Constructor:构造方法,由Constructor创建一个对象
无参构造方法:
例如:
String str=java.lang.String.class.newInstance();
有参构造方法:
例如:
Constructor con=java.lang.String.class.getConstructor(StringBuffer.class);
String newInstance = (String) con.newInstance(new StringBuffer("hehe"));
Filed:字段的反射
//Person类用于测试
package com.test; public class Person { public String uname; private String passd; public String getPassd() { return passd; } public void setPassd(String passd) { this.passd = passd; } public Person(String uname, String passd) { super(); this.uname = uname; this.passd = passd; } }
//反射创建Person对象 Person p=(Person)Class.forName("com.test.Person").getConstructor(String.class,String.class).newInstance(new String("hehehe"),new String("123he")); //获取对象的公有字段和 Field field=com.test.Person.class.getField("uname"); String uname=(String) field.get(p); System.out.println(uname); //获取对象的非公有字段 Field field1=com.test.Person.class.getDeclaredField("passd"); field1.setAccessible(true); String passd=(String) field1.get(p); System.out.println(passd); //改变对象里的所有公有String字段 Field [] fields=com.test.Person.class.getFields();//只能获取公有字段 for (Field f : fields) { if(f.getType()==String.class){ String oldfield=(String)f.get(p); String newfield=oldfield.replace("h", "g"); f.set(p, newfield); } } //数组的反射 String [] str1=new String[]{"a","b","c"}; Class c=str1.getClass(); if(c.isArray()){ int len=Array.getLength(str1); for (int i = 0; i < len; i++) { System.out.println(Array.get(str1, i)); } }
Method 类方法的反射
Method me=String.class.getMethod("charAt", int.class); //方法对象me的invoke方法 System.out.println( me.invoke(uname, 2));
当uname为null时表示调用静态方法,以后参数为可变长度的方法参数
通过反射,获得方法参数泛型里的参数类型
public class Test { public static void main(String[] args) { Vector<Person> plist=new Vector<Person>(); try { Method me=Test.class.getMethod("getT", Vector.class); Type[] types = me.getGenericParameterTypes(); ParameterizedType type= (ParameterizedType)types[0]; System.out.println(type.getRawType()); System.out.println(type.getActualTypeArguments()[0]); } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } } public void getT(Vector<Person> plist){ } }
输出:
class java.util.Vector
class com.test.Person
欢迎留言交流
相关文章推荐
- struts2
- 第三个spring冲刺第5、6、7天(三天汇总)
- Java EE开发环境搭建
- Spring+Quartz实现定时任务的配置方法
- SpringMVC集成Hibernate分页查询到对象数组问题
- cron表达式详解(Spring定时任务配置时间间隔)
- SpringMVC集成Hibernate返回json出现异常
- java 程序性能优化《第二章》设计优化 2.1善用设计模式 2 代理模式
- spring定时任务的配置使用
- Java-----正则表达式匹配模式[贪婪模式、勉强模式、占有模式]
- Hibernate集成Spring出现写操作在只读事物中的问题
- 【SSH进阶之路】Struts + Spring + Hibernate 进阶开端(一)
- 【SSH进阶之路】Struts基本原理 + 实现简单登录(二)
- 【SSH进阶之路】深入源码,详解Struts基本实现流程(七)
- 【SSH进阶之路】一步步重构MVC实现Struts框架——从一个简单MVC开始(三)
- 【SSH进阶之路】一步步重构MVC实现Struts框架——封装业务逻辑和跳转路径(四)
- 【SSH进阶之路】一步步重构MVC实现Struts框架——彻底去掉逻辑判断(五)
- 【SSH进阶之路】一步步重构MVC实现Struts框架——完善转向页面,大功告成(六)
- 从头认识java-13.6 类型擦除(type erasure)
- 【SSH进阶之路】Spring简介,搭建Spring环境——轻量级容器框架(一)