*此文章是观看黑马雷哥关于Java反射的视频做的笔记,如有错请多指教。
一、认识反射
反射在JavaAPI中的详解:
说白了,反射就是:加载类,并允许以编程方式解剖类中的各种成分(成员变量、方法、构造器等)。
如图:
二、反射还学什么?
加载类、获取类的字节码:class对象
获取class对象的三种方法:
//获取class的三种方法
package com.comple;
public class demo {
public static void main(String[] args) {
//第一种方式获取Class对象
Class c1 = Student.class;
System.out.println(c1.getName());//获得全类名:com.comple.Student
System.out.println(c1.getSimpleName());//获得简名:Student(类名)
//第二种方式获取Class对象
Class c2=Class.forname("com.comple.Student");
//第三种方式获取Class对象
Student stu1 = new Student();//这一new 产生一个Student对象,一个Class对象。
Class c3 = stu1.getClass();//获取Class对象
2.获取类中的构造器
demo类:
package com.comple;
public class demo {
private String name;
private int age;
public demo() {
}
public demo(String name, int age) {
this.name = name;
this.age = age;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "demo{name = " + name + ", age = " + age + "}";
}
}
Class 提供的从类中获取构造器的方法:
Test类:
package com.comple;
import org.apache.tomcat.util.bcel.Const;
import java.lang.reflect.Constructor;
public class demoTest {
public static void main(String[] args) {
//1.反射第一步先获取类的class对象
Class c=demo.class;
//2.获取类的全部构造器
Constructor[] constructors=c.getConstructors();
/*
创建一个构造器类型的数组来接受类中的所有构造器
*/
//3.遍历数组中的每一个构造器
for (Constructor constructor : constructors) {
System.out.println(constructor.getName()+"--->"
+constructor.getParameterCount());
/*
获取构造器的名字和构造器的参数个数
*/
}
}
}
运行结果:
public demo() {
}
public demo(String name, int age) {
this.name = name;
this.age = age;
}
即得到这个无参构造和有参构造的名字和参数个数
***getConstructors()只能拿到public修饰的构造器,建议使用getDeclaredConstructors();
***getConstructor(参数类型)获取单个构造器,需要写参数类型来定位构造器
eg:
//获取无参构造器
Constructor constructor1 = c.getDeclaredConstructor();
//获取有参构造器
Constructor constructor2 = c.getDeclaredConstructor(String.class, int.class);
System.out.println(constructor2.getName() + "--->"
+ constructor2.getParameterCount());
运行结果:
补充:
获取类构造器的作用:依然是初始化对象返回。
//得到class对象
Class c=demo.class;
//获取无参构造器
Constructor constructor = c.getDeclaredConstructor();
//如果构造器私有化,进行暴力反射
constructor.setAccessible(true);
//调用此构造器
demo s=(demo)constructor.newInstance();
System.out.println(s);
输出结果:
3.获取类的成员变量
Field[] fields=c.getDeclaredFields();//获取类的全部成员变量
Field fname=c.getDeclaredField("name");//获取特定的成员变量
获取成员变量的作用:
4.获取类的成员方法
反射的作用:
(1)基本作用:得到一个类的全部成分并操作
(2)破坏封装性
(3)最重要是:适合做Java的框架,基本上主流框架都会基于反射设计出一些通用的功能
*目前反射就学习了这些,如学到新的内容还会再补充。