Class类与java反射

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类型

 

posted @ 2019-03-09 11:05  Zkkkkk~  阅读(809)  评论(0编辑  收藏  举报