反射机制(reflect)

一.反射机制用来描述所有的类
Class 用来类描述类本身
Package 用来描述类所属的包
Field 用来描述类的属性
Method 用来描述类的方法
Constructor 用来描述类的构造方法
Annotation 用来描述类中的注解
1.如何获取class
三种方式:
Class clazz=class.forName("包名.类名")
Class clazz=类名.class
xx对象.getClass();object类中的方法
2.常用方法
modifiers();获取修饰符,0代表默认不写,1代表public 4.protected ...等等
package reflect;
3.field的常用方法

import java.lang.reflect.Field;
public class test {
    public static void main(String[] args) {
        try {
            Class clazz=Class.forName("reflect.person");
            String name=clazz.getName();//获取类名
            System.out.println(name);
            String simplename=clazz.getSimpleName();
            System.out.println(simplename);
            Class parClazz=clazz.getSuperclass();//获取继承的父类
            Class[] cc=clazz.getInterfaces();//获取实现的接口
            System.out.println(parClazz.getName());
            Package p=clazz.getPackage();
                    p.getName();
                    //通过反射创建对象;
            try {
                   
                person person=(person) clazz.getDeclaredConstructor().newInstance(); //JDK9推荐这个方法了

            }catch (Exception e){
                e.printStackTrace();
            }

            try {
                Field field=clazz.getField("name");//获取属性
                int mod=field.getModifiers();//获取修饰符
                Field[] fields=clazz.getFields();//获取所有的属性
                Class cl=field.getType();//获取数据类型
                //如上的两个方法,不能获取私有的属性,但是可以获取继承的属性
                Field ff=clazz.getDeclaredField("name");//获取私有属性
                ff.setAccessible(true);//表示私有属性可被操作
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

4.获取类中的方法
Method m=clazz.getMethod("eat")
5.设计一个方法,传入字符串,创建对象IOC(Inversion Of Control)控制反转 DI(依赖注入)自动注入
属性,DI是IOC的一个体现,先要有IOC;

package reflect;

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

public class CreateObject {
    /**
     * 设计一个方法,传入字符串,创建对象
     * IOC思想
     * DI依赖注入
     */
    //是否需要参数
    //是否需要返回值
    public Object getBean(String className){
        Object object=null;
        try {
                Class clazz=Class.forName(className);
                //创建对象
                  object=clazz.getDeclaredConstructor().newInstance();
                  //这里做一个DI,自动注入属性
            //通过clazz获取所有私有属性---->通过属性获取属性名---->通过属性名获取set名
            Field[] fields=clazz.getFields();
            for (Field field:fields) {
               //获取属性名
               String fieldName=field.getName();
               //手动拼接字符串,拼接属性对应的set方法名,StringBuilder性能比String拼接好;
                StringBuilder setMethodName=new StringBuilder("set");
                setMethodName.append(fieldName.substring(0,1).toUpperCase());//属性首字母大写拼接
                setMethodName.append(fieldName.substring(1));//其余部分拼接
                //获取field对应的属性类型
                Class fieldType=field.getType();
                //获取set方法
                Method method=clazz.getMethod(setMethodName.toString(),fieldType);
                String value="";//这个是需要赋的值,是从配置文件或其他地方得来的
                Constructor con=fieldType.getConstructor(String.class);//通过包装类的String构造方法
                method.invoke(object,con.newInstance(value));//将String转成属性的类型
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return object;
    }
}

你可能感兴趣的:(反射机制(reflect))