java基础(1)--反射
来源:互联网 发布:cdn.bootcss.com 知乎 编辑:程序博客网 时间:2024/05/16 10:47
什么是反射
……
通常程序都是访问写的各个对象、使用对象的方法;反射使得程序可以访问对象的类型、类的方法、类的成员等信息,可以通过反射调用对象的方法
反射有什么作用
反编译:.classà.java
通过反射机制,可访问java对象类型、方法、成员变量、构造方法
反射如何使用
1.获取Class(类类型)的实例对象:
1) Class.forName(“类名的全称”) 加异常处理
2) 类名.class //获取类(所有写的类是java.lang.Class的实例对象)的class静态成员变量
3) 对象.getClass() //用类的对象的getClass()方法
Class c1 = Class.forName("test.javase.Student");//必须是类的全称,要加异常处理Class c2 = Student.class;Student s = new Student();Class c3 = s.getClass();
System.out.println(c1.getName());//得到c1全名:test.javase.StudentSystem.out.println(c2.getSimpleName());得到c2去掉包名的类名:Student
2.通过Class(类类型)创建该类的对象实例(即通过c1、c2、c3创建Student的实例):
Student s1 = (Student) c1.newInstance();//要加异常处理
3.获取对象的方法信息
Method[] m1 = c1.getMethods();//获取的是所有public的函数,包括父类继承而来的,得到一个数组//getDeclaredMethods()获取的是所有该类自己声明的方法,不问访问权限
获取对象方法的名称、返回值类型、参数类型的列表等
m1[3].getName()//得到方法的名称Class rx = m1[3].getReturnType()//得到方法的返回值类型Class[] px = m1[2].getParameterTypes();//得到方法的参数类型的列表
获得某一个方法的信息(方法的名称和参数列表决定方法)
Method m = c1.getMethod("setName",String.class);Method m = c1.getMethod("getName");//没有参数就不写,或者写new Class[]{}//多个参数,写c1.getMethod("setName",String.class ,int.calss);或者c1.getMethod("setName",new Class[]{String.class ,int.calss })//getMethod()获取public的方法//getDelcaredMethod()获取自己声明的方法
执行方法(用invoke(类的对象名Object obj,方法的参数Object… args))
Student s1 = ……Object o = m.invoke(s1,"lhx");//没有参数就不写,或者写成new Object[]{}//多个参数写“lhx”,“lhx”或者new Object[]{“lhx”, “lhx”}
4.获取对象的成员变量信息
Field[] fs = c1.getDeclaredFields();//获取的是类自己声明的所有成员变量的信息//getFields()方法获取的是所有的public的成员变量的信息
获取对象的成员变量的名称、类型等
for(Field field:fs){ System.out.println(field.getName());//getName()获取成员变量的名称 System.out.println(field.getType().getName());//getType()获取成员变量的类型(Class类型)}
获取对象某一个成员变量信息&&设置某一个对象的成员变量
Field f = c1.getDeclaredField("name");Student s1 = ……f.set(s1,"zrx");
5.获取对象的构造函数的信息
Constructor constructor = c1.getConstructor();//加异常处理//getConstructors()得到的是列表System.out.println(constructor);//输出public test.javase.Student()System.out.println(constructor.getName());//输出test.javase.Student
getname() 得名字
getParameterTypes() 的参数列表
6.获取某类的父类&&实现接口
getSupperclass()
getInterfaces()
通过反射了解集合的泛型
ArrayList list1 = new ArrayList();ArrayList<String> list2 = new ArrayList<String>();list1.add(29);list1.add("hello");list2.add("hello");//list2.add(20)加不进去System.out.println(list1.getClass()==list2.getClass());//输出true
如上代码,说明反射操作是编译之后的操作:对象.getClass()得到的是类类型Class,是“字节码”,集合的泛型是防止输入错误的,只在编译阶段有效,经过编译则无效,如下:
Method method = list2.getClass().getMethod("add",Object.class);method.invoke(list2,20);
这样就向list2中添加了20
- java 反射基础(1)
- java基础--反射(1)
- java基础(1)--反射
- Java基础 泛型(反射)
- Java基础---反射(Reflection)
- Java 反射基础(上)
- Java 反射基础(下)
- java基础(8)反射
- java反射(一):反射基础
- [ java ] java基础反射!
- Java---类反射(1)---类反射入门和基础
- Java基础之反射(一):反射入门
- Java基础之反射(二):反射应用
- JAVA基础 (二)反射 深入解析反射机制
- JAVA基础 (三)反射 深入解析反射机制
- 黑马程序员-JAVA基础加强-反射1
- JAVA基础加强之反射1
- java基础巩固笔记(1)-反射
- 将hibernate插件导入eclipse中
- error: cannot spawn git: No such file or directory问题解决办法
- C/C++题库整理(三)
- leetcode--1.Two Sum
- Python字典的fromkeys方法“疑惑”解析
- java基础(1)--反射
- SQL进阶---第一单元(第七到第十课)、Manipulation
- 一些比较实用的网站
- mysqli扩展 增删改
- How to create more time?
- HDU-5510 Bazinga、HDU-5521 Meeting
- 47. Permutations II
- thinkphp5 隐藏index.php方法
- Mybatis操作数据库实现单表/多表查询流程