22-反射

反射

学习目标:

掌握反射四大类的含义

掌握反射四大类的常用方法

掌握得到Class类的三种方式

第1章: 什么是反射

反射就学习四个类就OK。

反射就是把Java类中的各种成分映射成一个个的java对象。例如,一个类有:成员变量,方法,构造方法,包等等信息,利用反射技术可以对一个类进行解剖,把各个组成部分映射成一个个对象。

简单一句话,反射就是为了拿到这个类的所有信息:构造函数、成员、方法等,拿到之后就可以做想做的事情了。

1.1 反射的常用类

Class类:可获取类和类的成员信息(这个类就是去描述一个类的类)

Field(成员、属性)类:可访问类的属性 (这个类就是用来描述 类的属性的。比如属性的类型,属性的名字,属性权限修饰符)

Method(方法)类:可调用类的方法(Method就是去描述类中的方法的,方法名字、参数、返回值、权限修饰符)

Constructor(构造器)类:可调用类的构造方法掌握了这四个类,就掌握了反射。(描述类中的构造函数的类)

1.2 如何使用反射:

1、先获取Class类

2、调用Class类的方法获取Filed或者Method或者Constructor,看你需要用什么

3、使用Field或者Method类或者来使用Constructor(设置属性或者调用方法)

第2章:Class类

2.1 获取Class类的三种方式:必须全部掌握

方式1:实例.getClass方法
方式2:类名.class
方式3:class.forName(“完整包路径.类名”)

package day22_反射.Class反射类; /** * @author:牧牛者 说明: */ public class ClassDemo { public static void main(String[] args) throws ClassNotFoundException { // 反射获取 三种方式 Class cls = String.class; Class aClass = Class.forName("java.lang.String"); Class aClass1 = "".getClass(); } }

2.2 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

第3章:Constructor类

得到Constructor就可以得到创建对象的权力了。

3.1 常用方法

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());

    }
}

第4章:Method类

4.1 常用方法

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);

    }
}

第5章:Field类

5.1 常用方法

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遍。

你可能感兴趣的:(Java从零到高薪就业,开发语言)