一.什么是反射?
当java程序运行时,反向通过一个类得到它的对象而不是编译时new出来,这个过程叫做反射(在运行时才知道要操作的是什么类)
二.反射的示例
通过一个例子,能更加的了解反射,下图是一个dog类,有属性,构造,方法:
package com.bdqn.Dog;
public class Dog {
//属性
private String dcolor;
String dtype;
private int dage;
private String dname;
//构造
public Dog(int a) {
System.out.println("int方法被执行");
}
public Dog(String a) {
System.out.println("String方法被执行");
}
public Dog() {
System.out.println("构造方法被执行");
}
//方法
public void eat(){
System.out.println("吃");
}
public void sleep(){
System.out.println("睡");
}
public void speak(){
System.out.println("叫");
}
public void run(){
System.out.println("跑");
}
}
main方法
package com.bdqn.Dog;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) throws Exception {
Class c=Dog.class;
//获得属性
Field[] fields=c.getDeclaredFields();
for (Field field: fields) {
System.out.println(field.getName()+"--"+field.getType());
}
//构造
Constructor c1=c.getConstructor(int.class);
c1.newInstance(1);
//调用eat方法
Method m=c.getMethod("eat");
m.invoke(c.newInstance(),null);
//所有方法
Method[] methods=c.getDeclaredMethods();
for (Method method: methods) {
System.out.println(method.getName()+"()");
}
//调用睡方法
methods[1].invoke(c.newInstance(),null);
}
}
通过main方法,利用反射可以把需要的内容从实体类取出来,代码中只有一部分方法,更多的可以自己去探索一下。
三.三种反射的区别
//第一种 只输出静态代码块资源
// Class c=Class.forName("com.bdqn.reflect.Student");
// System.out.println("__________________");
//第二种 非常不主动的加载方式
Class c1=Student.class;
// Field[] fields=c1.getDeclaredFields();
// for (Field field: fields) {
// System.out.println("");
// }
// System.out.println("__________________");
//第三种 所有的都会执行
//构造器初始化整个类里面的所有东西
// Class c2=new Student().getClass();
// Method[] methods=c1.getDeclaredMethods();
//
// for (Method method: methods) {
// System.out.println(method.getName()+"~~"+method.getGenericReturnType());
// }
以上这些,就是反射的一些大概内容,也是一些基础。