Java中的反射技术总结

Java中的反射技术总结

一、简介
1.反射的定义:根据Java的特性,类是用来描述对象的,那么可以将反射理解为反射机制是用来描述类的。

反射机制图解:
Java中的反射技术总结_第1张图片
2.反射机制中的主要类
Class 描述类本身
Field 描述类中的属性
Method 描述类中的方法
Constructor 描述类的构造方法
Annotation 描述类中的注解
二、反射机制中的主要类概述
1.如何获取一个Class
1.1知道类全名的情况下:Class clazz=Class.forName (“类全名”)
1.2知道类名的情况下:Class clazz=类名.class;
1.3知道对象的情况下:Class clazz=对象.getClass()
1.4Class中的主要方法
一般方法:
getModifiers()获取类的修饰符,返回一个int参数,1-publi、2-private、4-protected、8-static…
getName()获取类全名
getSimpleName()获取类简单名字
getPackage()获得类的包,返回Package对象
getSuperclass()获取当前类的超类
getInterfaces()获取当前类实现的接口
getClasses()获取类中的内部类
重要方法:
newInstance()创建一个获取的类 必须要有无参数构造方法,否则抛出异常

通过类得到Field的方法:
这两个方法只能获取公有的属性,包含继承来的属性:
getField(属性名)获取class中的属性,返回一个Field类型
getFields()获取class中的所有属性,返回一个Field[]数组
这两个方法能获取公有和私有属性,不包含继承来的属性
getDeclaredField(属性名))获取class中的属性,返回一个Field类型
getDeclaredFields()获取class中的所有属性,返回一个Field[]数组

通过类得到Method的方法:
这两个方法可以获取公有的方法,包含继承关系
getMethod(方法名,方法的参数类型)获取class中的方法,返回一个Method类型
getMethods()获取class中的所有方法,返回一个Method[]数组
这两个方法能获取公有和私有的方法,不包含继承关系
getDeclaredMethod(方法名,方法的参数类型)获取class中的方法,返回一个Method类型
getDeclaredMethods()获取class中的所有方法,返回一个Method[]数组

通过类得到Constructor的方法:
这两个方法只能获取公有的属性,包含继承来的属性:
getConstructor(参数类型)获取class中的方法,返回一个Constructor类型
getConstructors()获取class中的所有方法,返回一个Constructor[]数组
这两个方法能获取公有和私有的方法,不包含继承关系
getDeclaredConstructor(参数类型)获取class中的方法,返回一个Constructor类型
getDeclaredConstructors()获取class中的所有方法,返回一个Constructor[]数组
2.Field中的方法
一般方法
getModifiers()获取属性的修饰符,返回一个int参数,1-publi、2-private、4-protected、8-static…
getName()获取属性名
getType()获取属性的类型,返回的是Class类型
重要方法
目的:操作属性,存取值
存值:set(对象名,属性赋值)
取值:get(对象名)返回值是属性的类型(造型)
以上是知道属性名,当属性名不知道的时候
用clazz.getFields()获取class中的所有属性,包括继承来的属性,返回一个Field[]数组
setAccessible(布尔值) 私有属性赋值权限
3.Method中的方法
一般方法
getModifiers()获取方法的修饰符
getName()获取方法名
getReturnType()获取返回值类型
getParameterTypes()获取方法参数列表,返回一个Class[]数组
getExceptionTypes()获取方法抛出异常类型,返回一个Class[]数组
重要方法
如何操作方法 调用方法,让它执行一次
invoke(对象,参数)执行方法,返回值是一个Objec类型,造型接收
setAccessible(布尔值) 私有方法执行权限
4.Constructor中的方法
一般方法
getModifiers()获取方法的修饰符
getName()获取构造方法名
getParameterTypes()获取方法参数列表,返回一个Class[]数组
getExceptionTypes()获取方法抛出异常类型,返回一个Class[]数组
重要方法
如何操作构造方法 执行一次
newInstance(参数对应的类型)执行构造方法,造型得到对象
三、反射机制小实例
1.要求:设计一个方法,通过给定一个字符串,返回一个对象,要求直接将参数传递给对象
2.思路:以前我们创建对象都是通过new对象的方式创建,设计这个方法要求根据一个String类型类名字符串直接得到一个对象,区别在于以前是通过new的形式创建,这次是通过反射机制创建
3.具体代码如下:
package IOC;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Scanner;

public class MySpring {

public Object getBean(String classname){
    Object obj=null;
    Scanner input =new Scanner(System.in);
    System.out.println("请给"+classname+"赋值");
    try {
        //获取classname对应的对象
        Class clazz=Class.forName(classname);
        //通过clazz创建一个对象
        obj=clazz.newInstance();
        //找到每一个不同对象的所有set方法   给属性赋值
        Field[] fields=clazz.getDeclaredFields();
        for (Field field:fields) {
            String fileName=field.getName();
            String firstLetter=fileName.substring(0,1).toUpperCase();//属性的首字母变大写
            String others=fileName.substring(1);
            StringBuilder builder=new StringBuilder("set");
            builder.append(firstLetter);
            builder.append(others);//得到方法名字
            //获取属性类型
            Class fieldClass=field.getType();
            //找方法
            Method setMethod=clazz.getMethod(builder.toString(),fieldClass);
            System.out.println("请给"+fileName+"赋值");
            String value=input.nextLine();
            Constructor con=fieldClass.getConstructor(String.class);
            setMethod.invoke(obj,con.newInstance(value));
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return obj;
}

}

你可能感兴趣的:(Java基础)