Java反射知识点总结
来源:互联网 发布:淘宝号信誉度查询 编辑:程序博客网 时间:2024/05/16 10:45
概念:
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。这种动态获取信息以及动态调用对象的方法的功能称为Java的反射机制。
反射主要是指程序可以访问,检测和修改它本身的状态或行为的一种能力。
用途:
在运行时判断任意对象所属的类;
在运行时构造任意一个类的对象;
在运行时判断任意一个类所具有的成员变量和方法;
在运行时调用任意一个对象的方法。
使用Java反射机制一般遵循三步:
1:获取想操作类的Class对象;
2:通过第一步获得的Class对象取得操作类的方法或属性名;
3:操作第二步取得方法或属性。
public class Role { private String name; private String type; public Role(){ } private Role(String name){ this.name=name; } public String getName(){ return name; } public void setName(String name){ this.name=name; } public String getType(){ return type; } public void setType(String type){ this.type=type; } public String toString(){ return "This is a role called "+this.name; }
取得操作类的三种方法:
1:调用Class 的forName()静态方法
Class cls=Class.forName("reflection.Role");//注意forName中的参数一定是完整的类名(包名+类名),且该方法需要捕获异常
2:使用类的class语法
Class cls=Role.class;
3:调用对象的getClass()方法
String str="abc";Class cls=str.getClass();
获取类的构造器:
Constructor类,用来封装反射得到的构造器
public Constructor<?>[] getConstructors()//返回类中所有的public构造器集合,默认构造器的下标为0public Constructor<T> getConstructor(Class<?>...parameterTypes)//返回指定public构造器,参数为构造器参数类型集合public Constructor<?>[] getDeclaredConstructors()//返回类中所有的构造器,包括私有public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)//返回任意指定的构造器
代码举例:
//制定参数列表获取特定的构造方法Constructor con=cls.getDeclaredConstructor(String.class);con.setAccessible(true);Object obj=con.newInstance("liyang");//获取所有的构造方法集合Constructor[] cons=cls.getDeclaredConstructors();cons[1].setAccessible(true);Object obj1=cons[1].newInstance("Tom");Object obj2=cons[0].newInstance();
获取类的成员变量:
Filed类,用来封装反射得到的变量
public Field getDeclaredField(String name)//获取任意指定名字的成员public Field[] getDeclaredFields()//获取所有的成员变量public Field getField(String name)//获取任意指定名字的public成员变量public Field[] getFields()//获取所有的public成员变量
代码举例:
//获取成员变量Field member=cls.getDeclaredField("name");member.setAccessible(true);member.set(obj1, "newTom");
获取类的方法:
Method类,用来封装反射得到的方法
public Method[] getMethods()//获取所有的共有方法的集合public Method getMethod(String name,Class<?>... parameterTypes)//获取指定公有方法 参数1:方法名 参数2:参数类型集合 public Method[] getDeclaredMethods()//获取所有的方法public Method getDeclaredMethod(String name,Class<?>... parameterTypes)//获取任意指定方法
代码举例:
//调用类的方法Method m1=cls.getMethod("getName",null);Object name=m1.invoke(obj1,null);Method m2=cls2.getMethod("setName",String.class);m2.invoke(obj1,"newTom2");
样例代码:
import java.lang.reflect.*;public class Reflect { public static void main(String[] args) throws Exception { // TODO 自动生成的方法存根 student studentA=new student(); studentA.setStuName("baoxu"); studentA.setStuAge(26); student studentB=new student(); copyBean(studentA,studentB); student studentC=(student)copyBean(studentB); Class<?> cls=student.class; Constructor c=cls.getDeclaredConstructor(String.class,int.class); c.setAccessible(true); Object studentD=c.newInstance("baoxu",26); Method staticMethod=cls.getMethod("show",String.class,int.class); staticMethod.invoke(cls, "baoxu",26); } private static void copyBean(Object from,Object to)throws Exception{ Class<?> fromClass=from.getClass(); Field[] FromFields=fromClass.getDeclaredFields(); Class<?> toClass=to.getClass(); Field toField=null; for(Field fromField:FromFields){ String name=fromField.getName(); toField=toClass.getDeclaredField(name); fromField.setAccessible(true); toField.setAccessible(true); toField.set(to, fromField.get(from)); } } private static Object copyBean(Object from)throws Exception{ Class<?> fromClass=from.getClass(); Object copyOne=fromClass.newInstance(); Field[] fromFields=fromClass.getDeclaredFields(); for(Field fromField:fromFields){ fromField.setAccessible(true); fromField.set(copyOne, fromField.get(from)); } return copyOne; }}class student{ private String stuName; private int stuAge; public student(){ } private student(String name,int age){ this.stuName=name; this.stuAge=age; } public String getStuName(){ return stuName; } public void setStuName(String name){ this.stuName=name; } public int getStuAge(){ return stuAge; } public void setStuAge(int age){ this.stuAge=age; } public String toString(){ return stuName+":"+stuAge; } public static void show(String name,int age){ System.out.println("hello,my name is "+name+". I'm "+age+" years old"); }}
0 0
- Java反射知识点总结
- java反射知识点总结
- Java反射知识点总结
- Java反射知识点总结
- 黑马程序员 知识点总结-Java反射
- 黑马程序员---Java高新技术反射知识点总结
- Java基础之反射知识点总结
- 【学习日记】java反射的知识点总结
- Java的灵魂--反射知识点总结
- Java基础之反射知识点总结
- 反射知识点总结
- 反射简单知识点总结
- Core Java第十六章知识点总结——反射
- DAY20--java中的反射机制常用知识点总结
- 黑马程序员 JAVA编程 枚举 反射知识点总结
- Java反射基础知识点总结(内含六部博文实例)
- JAVA知识点总结-17类加载器,反射
- java反射机制知识点
- spring单元测试使用
- 深入理解Java1:SimpleDateFormat安全的时间格式化
- python学习笔记
- 学习笔记—二叉树中求度为2的节点个数
- Mysql日期函数使用汇总
- Java反射知识点总结
- 【SSH项目实战】国税协同平台-17.权限鉴定&解决登录嵌套
- MySql中having字句对组记录进行筛选使用说明
- java---用两个栈实现队列&&用两个队列实现栈
- 国嵌嵌入式学习笔记之学习方法
- Java代码复用
- Summary Before NOIP
- 非互质中国剩余定理求线形模方程组(形如 X%mi=ai)
- 动态设置android:drawableLeft|Right|Top|Bottom