1.why:
反射是学习java框架的基础。java框架的底层实现都是基于反射
2.Class:
1).Class是一个类型
2).当一个.class文件被加载到JVM是,在JVM内部会创建唯一的一个Class对象,它对应.class文件。
3)如何得到Class对象
1.1 最常用的方式 可以利用Class类的静态方法: forName(className)
String className = “lesson06.Person”;
clazz = Class.forName(className);
1.2如果已经存在对应的对象,则可以调用其getClass()方法
Object obj = new Person();
clazz = obj.getClass();
System.out.println(clazz);
1.3也可以直接利用 类 的 class 静态属性:该种方式不会使静态代码块执行
clazz = Person.class;
System.out.println(clazz);
4).Class对象有什么作用:Class是反射的核心,一切反射都是从Class开始
①.如何获取全部的方法:调用了Class对象的getMethods()返回Method的数组
//获取全部的public方法。如果需要获取private方法,需要调用clazz.getDeclareMethods()
Method[] methods = clazz.getMethods();
for(Method method:methods){
System.out.println("--->" + method.getName());
}
②.获取指定的方法
//注意:需要备齐
//1).Class对象
//2).方法名setName()
//3).参数类型的列表:String.class
Method method = clazz.getMethod("setName", String.class);
System.out.println("**"+method );
③创建Class对应的对象:
//创建Class 对象对应的那个类的对象:调用Class对象的newInstance() 方法
Object object = clazz.newInstance();
//注意:必须要在Class对象所对应的那个类中提供一个共有的,无参数的构造器!否则运行就会出错!
5).如何使Method 方法执行
①.Method:在反射中对应方法
②.执行方法:调用对象的invoke()方法
//注意:需要备齐
//1).Method 对象 method
//2).Method 所在类的对象.object
//3).执行方法需要传入的参数 atguigu
method.invoke(object, "atguigu");
6).后面的内容:
①.操作属性。Field
②.如何操作 private 类型的成员(包括属性和方法)
③.反射和泛型
④.如何获取类的注解。
package lesson06;
public class Person {
private String name;
private int age;
public Person(){
System.out.println("Person's constructor...");
}
static{
System.out.println("static block...");
}
public String getName(){
return name;
}
public void setName(String name){
System.out.println("setName: "+name);
this.name = name;
}
public void setName(){
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + "]";
}
}
package lesson06;
import java.lang.reflect.Method;
public class TestClass {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, Exception, SecurityException {
Class clazz = null;
//1.得到Class对象
//1.1 最常用的方式 可以利用Class类的静态放过: forName(className)
String className = "lesson06.Person";
clazz = Class.forName(className);
//1.2如果已经存在对应的对象,则可以调用其getClass()方法
// Object obj = new Person();
// clazz = obj.getClass();
// System.out.println(clazz);
//
//1.3也可以直接利用 类 的 class 静态属性:该种方式不会使静态代码块执行
// clazz = Person.class;
System.out.println(clazz);
//2.得到Class对象能做什么?Class对象是反射的核心。
//2.1创建Class 对象对应的那个类的对象:调用Class对象的newInstance() 方法
//注意:必须要在Class对象所对应的那个类中提供一个共有的,无参数的构造器!否则运行就会出错!
Object object = clazz.newInstance();
System.out.println(object);
//2.2得到Class对象所对应那个类中有哪些方法
//注意:类中的方法对应在反射中对应的类是:Method
Method[] methods= clazz.getMethods();
for(Method method:methods){
System.out.println("--->" + method.getName());
}
//2.3得到Class对象所对应的那个类的指定方法。
//注意:需要备齐
//1).Class对象
//2).方法名setName()
//3).参数类型的列表:String.class
Method method = clazz.getMethod("setName", String.class);
System.out.println("**"+method );
//2.4使方法执行:调用Method对象的invoke方法
//注意:需要备齐
//1).Method 对象 method
//2).Method 所在类的对象. object
//3).执行方法需要传入的参数 atguigu
System.out.println();
System.out.println(object);
method.invoke(object, "atguigu");
System.out.println(object);
// Person person1 = new Person();
// Person person2 = new Person();
// Person person4 = new Person();
// Person person3 = new Person();
}
}