反射的官方定义:在运行状态中,对于任意一个类,都能知道这个类的所有的属性和方法;对于对于对象,都能够调用他的任意一个方法和属性;这种动态获去信息以及动态调用对象的方法的功能称为java语言的放射机制。
反射就是把Java类中的各种成分映射成java类。一个类的组成部分无非也就是:成员变量、方法、构造方法、包等。表示java的Class类显然要提供一系列的的方法,来获取其变量、方法、构造器、修饰符、包等信息,这些信息就是用相应的类的实例的对象来表示,他们分别是:Field、Method、Contructor、Package等等。一个类中的每个成员变量都可以用相应的反射API类的一个实例对象来表示,反射主要使用来开发:工具、架构、动态开发等工程。
放射机制能做什么:
- 在运行时可以判断任意一个对象所属的类
- 在运行时可以任意构造一个类的对象
- 在运行时可以任意调用一个类的成员变量和方法
- 在运行时任意调用一个对象方法
- 可以生成动态代理
class类
描述一、在面向对象的世界里,万物皆对象,类是对象,类是java.lang.Class类的实例对象,联外是由java虚拟机才能new楚class对象。
描述二、Java程序中,所有的Java类都属于同一类事务,描述这一类事物的名称就是Class。
获取各个类字节码的方法有三种:
类名.class //直接用类.class获取
对象.getClass//通过对象调用器getClass()方法
Class.forName(“java.util.Date”)//a通过类的加载器获取
//获取类字节码Demo
public static void main(String[] args){
//1、用类的加载器获取
Class clazz1 =Class.forName("reflect.Person");
//2、用类.class获取
Class clazz2 =Person.class;
//3、用对象.getCals获取
Class clazz3 = new Person().getClass();
}
//反射构造方法
public class ReflectConstrustor(){
//反射构造函数:public Person()
@Test
public void test1(){
Class clazz = Class.forName("reflect.Person");
Constructor constructor = clazz.getConstructor(null)
Person p = (person)constructor.newInstance(null);
System.out.println(p.name);
}
//反射构造函数:public Person(String name)
@Test2
public void test2(){
Class clazz= Class.forName("reflect.Person");
Constructor constructor = clazz.getConstructor(String.class);
Person p = constructtor.newInstance("lsh1");
System.out.println(p.name);
}
//反射构造函数:public Person(String name,int password)
@Test
public void test3(){
Class clazz = Class.forName("reflect.Person");
Constructor construct = clazz.getConstructor(String.class,int.class);
Person p =constructor.newInstance("lsh",123);
System.out.println(p.name+"---"+p.password);
}
}
反射的基本步骤
1、获取Class类对象,就是获取指定名称的字节码文件对象。–>2、获取类的成员变量对象、成员方法对象、构造方法对象。–>3、访问成员变量、调用方法、调用构造器函数创建实例对象。