反射(获得类的Class对象、动态获取类的信息)

目录

1.概念和作用

2.反射的基本用法

Class类:

Construor类

Field类

Method类

3.反射的案例

自定义java对象转json工具类


1.概念和作用

以前在项目中使用类,是正向使用,知道类名,new类的对象。

概念:

在一些框架/组件中,为了可以对任意的类进行处理,要获得类的Class对象,通过类的Class对象获取类的信息,创建对象,调用对象中的方法,是反向使用

作用:动态获取类的信息

优点:在运行时可以动态获取任意类的信息,创建对象,调用对象方法属性;

           提高代码灵活性复用性。

缺点:需对类的信息进行解析判断处理,效率低;

          使用反射通常要在一个没有安全限制的程序运行;

          反射可以绕过一些限制访问的属性或方法,可能会导致破坏代码本身的抽象性。

2.反射的基本用法

Class类:

一旦class文件被加载(创建对象,使用类中的静态成员,类名.class,Class.forNmae(类名))

都会创建类的Class对象,只有为同一个类,获得的Class对象才是同一个。

获取Class类的方法:

1.通过对象名获取到类的Class对象
User user=new User();
Class c1=user.getClass();

2.通过类名.class获取到类的Class对象
Class c2=User.class;

3.通过Class.forNmae("类的地址")

Construor类

getConstructor();    获得类中构造方法,获得公共权限构造方法

getDeclaredConstructor(类...parameterTypes)    可以获得私有的构造方法

setAccessible(true/false);    设置对私有权限构造方法进行操作

newInstance();    通过构造方法,创建对象

Field类

获得类中的属性:

getField ("name");   获得的是指定名称公共权限属性

getFields();   获得所有公共权限属性

getDecLaredField("name");   获得的是指定名称私有权限属性

getDeclaredFields();  获得类中所有的成员方法(包含私有的)

Method类

getMethods();  获得类中所有的公共的成员方法

getMethod("name",type);   获得公共的指定名称参数的成员方法

invoke(object,para);  调用类代表的方法

getDeclaredMethod(name,type);   获得私有的指定名称参数的成员方法

3.反射的案例

自定义java对象转json工具类

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

public class Test5 {

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {

        //自定义Java对象转为Json工具类  ---> {"name":值,id:值}

        User user=new User(10,"rr");
        Car car=new Car(20,"蓝色");
        String json=Test5.objectToJson(user);
        String json1=Test5.objectToJson(car);
        System.out.println(json);
        System.out.println(json1);
    }

    public static String objectToJson(Object object) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        String s="{";
        Class c=object.getClass();
        Field[] fields=c.getDeclaredFields();//获取所有的属性
        for(Field f:fields){
            String mname=name(f.getName());//方法名
            Method method=c.getMethod(mname);
            s+=f.getName()+":"+method.invoke(object)+",";
        }
        s=s.substring(0,s.length()-1);
        s+="}";
        return s;
    }

    public static String name(String fieldName){
        String methodName="get"+String.valueOf(fieldName.charAt(0)).toUpperCase()+fieldName.substring(1);
        return methodName;
    }

}

你可能感兴趣的:(java,开发语言,reflect)