掌握反射四大类的含义
掌握反射四大类的常用方法
掌握得到Class类的三种方式
反射就学习四个类就OK。
反射就是把Java类中的各种成分映射成一个个的java对象。例如,一个类有:成员变量,方法,构造方法,包等等信息,利用反射技术可以对一个类进行解剖,把各个组成部分映射成一个个对象。
简单一句话,反射就是为了拿到这个类的所有信息:构造函数、成员、方法等,拿到之后就可以做想做的事情了。
Class类:可获取类和类的成员信息(这个类就是去描述一个类的类)
Field(成员、属性)类:可访问类的属性 (这个类就是用来描述 类的属性的。比如属性的类型,属性的名字,属性权限修饰符)
Method(方法)类:可调用类的方法(Method就是去描述类中的方法的,方法名字、参数、返回值、权限修饰符)
Constructor(构造器)类:可调用类的构造方法掌握了这四个类,就掌握了反射。(描述类中的构造函数的类)
1、先获取Class类
2、调用Class类的方法获取Filed或者Method或者Constructor,看你需要用什么
3、使用Field或者Method类或者来使用Constructor(设置属性或者调用方法)
package day22_反射.Class反射类; /** * @author:牧牛者 说明: */ public class ClassDemo { public static void main(String[] args) throws ClassNotFoundException { // 反射获取 三种方式 Class
方法 |
作用 |
T newInstance() |
创建反射类对应的类的实例,只能调用无参 |
static Class forName(String className) |
获取反射类 |
ClassLoader getClassLoader() |
获取类加载器 |
Package getPackage() |
获取包 |
String getName() |
获取反射类的名称 |
Constructor getConstructor(Class... parameterTypes) |
获取public的构造器 |
Constructor getDeclaredConstructor(Class... parameterTypes) |
获取本类的构造器,不限制权限。 |
public A getDeclaredAnnotation(Class annotationClass) |
获取本类的注解 |
public Annotation[] getAnnotations() |
获取所有公共注解 |
public A getAnnotation(Class annotationClass) |
获取类类上的注解,包括父类可以继承而来的 |
public Field getDeclaredField(String name) |
只能获取本类的成员,不限制权限修饰符,但是不能获得父类继承而来的任何成员。 |
Field[] getDeclaredFields() |
只能全部获取本类的所有成员,不限制权限。 |
public Method getDeclaredMethod(String name, Class... parameterTypes) |
只获取本类方法,不限制权限。 |
Method getMethod(String name, Class... parameterTypes) |
只获取public方法,包括从父类继承而来的 |
public native boolean isAssignableFrom(Class cls); |
判断此Class对象表示的类或接口是否与指定的Class参数表示的类或接口相同,或者是其超类或超接口。 如果是,则返回true ; 否则返回false |
得到Constructor就可以得到创建对象的权力了。
public T newInstance(Object ... initargs)// 因为构造函数的参数 个数和类型都是不确定的,所以只能用Object 的可变参数接收
用这个类来创建实例。
package day22_反射.Constructor构造类;
import day22_反射.User;
import java.lang.reflect.Constructor;
/**
* @author:牧牛者 说明:
* // 先拿到反射类
*/
public class ConstructorDemo {
public static void main(String[] args) throws Exception {
Class userClass = User.class;// 拿到反射类
userClass.getConstructor();// 拿到构造器对象
User user = userClass.newInstance();// 创建对象
user.setAge(11);// 设置年龄
Constructor constructor = userClass.getConstructor(String.class, Integer.class);
User u = constructor.newInstance("张三", 11);
System.err.println(u.getName());
System.err.println(u.getAge());
}
}
public Object invoke(Object obj, Object... args) |
将对象实例调用这个方法。 |
public T getAnnotation(Class annotationClass) |
获取方法上的注解 |
package day22_反射.Method方法类;
import day22_反射.User;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* @author:牧牛者 说明:
*/
public class MethodDemo {
public static void main(String[] args) throws Exception {
Class userClass = User.class;
Constructor constructor = userClass.getConstructor();
User user = constructor.newInstance();
user.setName("张三");// 设置值
Method getName = userClass.getDeclaredMethod("getName");
Object invoke = getName.invoke(user);// 反射调用方法执行,参数根据需要 传递
System.err.println(invoke);
}
}
public T getAnnotation(Class annotationClass) |
获取成员的注解 |
public void set(Object obj, Object value) |
给实例的这个成员设置值 |
public Object get(Object obj) |
获取这个成员的值 |
public void setAccessible(boolean flag) |
设置可以访问,修改成员的访问权限。 |
package day22_反射.Field成员类;
import day22_反射.User;
import java.lang.reflect.Constructor;
/**
* @author:牧牛者 说明:
*/
public class FieldDemo {
public static void main(String[] args) throws Exception {
Class userClass = User.class;
Constructor constructor = userClass.getConstructor();
User user = constructor.newInstance();
user.setName("张三");// 设置值
java.lang.reflect.Field nameFiled = userClass.getDeclaredField("name");
nameFiled.setAccessible(true);// 解除封装
Object o = nameFiled.get(user);// 获取值 User with modifiers "private"
System.err.println(o);
// java.lang.reflect.Field phone = userClass.getDeclaredField("phone");
// java.lang.reflect.Field nickName = userClass.getDeclaredField("nickName");
// java.lang.reflect.Field nickName1 = userClass.getField("nickName");
java.lang.reflect.Field phone1 = userClass.getField("phone");// 能够获取公共的属性,包括了从父类继承而来的
System.err.println(1);
user.setNickName("你好");
String nickName = user.getNickName();
System.err.println(nickName);
java.lang.reflect.Field[] fields = userClass.getFields();
System.err.println(fields);
}
}
1、创建一个User类,属性有age,name, id,分别用反射创建实例,调用方法,获取成员。
2、自己定义类和属性,使用反射四大类的常用方法1遍。