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

 

 

原创粉丝点击