1.什么是反射?
Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;
2.Class类对象:在类加载时创建的对象,存储在堆中,通过这个对象可以获取类的信息
获取Class类对象的方法:
//1、通过对象调用 getClass() 方法来获取,通常应用在:比如你传过来一个 Object // 类型的对象,而我不知道你具体是什么类,用这种方法 Person p1 = new Person(); Class c1 = p1.getClass(); //2、直接通过 类名.class 的方式得到,该方法最为安全可靠,程序性能更高 // 这说明任何一个类都有一个隐含的静态成员变量 class Class c2 = Person.class; //3、通过 Class 对象的 forName() 静态方法来获取,用的最多, // 但可能抛出 ClassNotFoundException 异常 Class c3 = Class.forName("com.ys.reflex.Person");
//需要注意的是:一个类在 JVM 中只会有一个 Class 实例,即我们对上面获取的 c1,c2,c3进行 equals 比较,发现都是true
3.通过 Class 类获取成员变量、成员方法、接口、超类、构造方法等
- getPackage():获取该类的存放路径 Package对象
- getSuperclass():获取继承的类 Class对象
- getInterfaces():获取接口 Class型数组
- getName():获得类的完整名字。 String对象
- getFields():获得类的public类型的属性。 Field型数组
- getFields(String name):获得类的public类型的指定属性 Field型对象
- getDeclaredFields():获得类的所有属性。包括private 声明的和继承类
- getMethods():获得类的public类型的方法。
- getDeclaredMethods():获得类的所有方法。包括private 声明的和继承类
- getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。
- getConstructors():获得类的public类型的构造方法。
- getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。(ex:int.class)
- newInstance():通过类的不带参数的构造方法创建这个类的一个对象。
4.动态操作构造器,方法,属性
构造对象:
1.User u= (User)clazz.newInstance()//创建对象,调用了无参构造器 2.//通过构造器创建对象 Constructor<User> c = clazz.getConstructor() c.newInstance(参数)//调用有参的构造器创建对象
反射弊端:影响性能,做访问检查,可以通过setAcessable(true),然后可以直接方法私有属性及方法,不再检查
5.操作泛型:java中的泛型是针对编译器说的,确保数据的类型安全,和免除强制类型转换的麻烦,但是一旦编译完成,泛型都会擦除,
6.操作注解
拓展:
类之父:Object,所有的类不声明继承某一个类,默认都继承Object类
Object类的常用方法:
- euqals():比较两个对象的实际内容是否相等 ==:比较两个对象的引用,即地址是否相同
- getClass():返回对象执行的Class实例 getClass().getname()可以获取类的名称,在一个类中可以直接使用这个方法,毕竟继承了父类,就有了这个方法
- toString():将一个对象返回为字符串形式,会返回一个字符串实例,因为toString方法是Object里面已经有了的方法,而所有类都是继承Object,所以“所有对象都有这个方法”, 它通常只是为了方便输出,比如System.out.println(xx),括号里面的“xx”如果不是String类型的话,就自动调用xx的toString()方法
- Object类中的getClass,notify,notifyall,wait等方法不能被重写,因为这些方法被定义为final类型