反射:
在运行状态中,对于任意一个类,都能知道它的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法,这种动态获取信息及调用对象的功能叫做java的反射机制。
使用反射访问方法和属性
使用反射动态访问和创建数组
获取类的相关信息
创建对象
什么是动态语言?
在程序运行时,可以改变其运行结构或变量类型。
Java存在动态机制—反射,java可以用于运行时加载,探知和使用编译期间完全未知的类,生成对象实体,再调用其属性或方法。
反射的动态性质:
1 运行期间生成对象实例
2 运行期间调用方法
3 运行时更改属性
Java反射实现的功能 5个
1 在运行时判断任意一个对象所属的类
2 在运行时构造任意一个对象
3 在运行时判断任意一个类所具有的方法和属性
4 在运行时调用任意一个对象的方法
5 生成动态代理
Java程序的对象在运行时都会出现两种类型:编译时类型和运行时类型。编译时类型由声明该对象使用时的类型决定;运行时类型由实际赋给该对象的类型决定
Father f = new Son()
学习反射:
Class 类 : 反射的核心类,可以通过它获取类的属性,方法等内容
Field 类 : 类的属性,可以获取和设置类中的属性
Method 类:类的方法,可以获取类中的方法信息,或者执行方法
Constructor类:表示类的构造器
public class Person {
private String name;
private int age;
private double num;
public Person() {
}
public Person(String name, int age, double num) {
this.name = name;
this.age = age;
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getNum() {
return num;
}
public void setNum(double num) {
this.num = num;
}
}
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* 反射的三种方式
*1.类名 .class;
* 2.forName(类所在的路径.类名)
* 对象.getclass();
*/
public class Testfanshe {
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
//1.类名 .class;
// Class clz = Person.class;
Class clz = null;
//2.forName(类所在的路径.类名)
try {
clz = Class.forName("httpserver.Test_fanshe.Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
// //3 对象.getclass();
// Person p = new Person();
// clz = p.getClass();
System.out.println("获取方法开始");
Method [] m = clz.getDeclaredMethods();
for (Method method:m){
System.out.println(method.toString());
}
System.out.println("获取方法结束");
//输出所有字段
System.out.println("输出所有字段开始");
Field []f = clz.getDeclaredFields();
for (Field field:f){
System.out.println(field.toString());
}
System.out.println("输出所有字段结束");
//创建对象
Person p1 = (Person) clz.getConstructor().newInstance();
p1.getName();
}
}