JAVA反射机制课堂知识点总结

反射机制:
1.一个类有多个组成部分,反射就是(在运行时)加载类,并解剖出类的各个组成部分。
【原本是为了方便修改现有的执行项目】
在JDK中,由Class类、Field类、Method类、Constructor类、Array类来实现反射机制,这些类都位于java.lang.reflect包中。
注:object类是所有类的父类
Java的Class类是java反射机制的基础,Class是一个java类,也继承了Object(Class是Object的直接子类)

2.三种方式:
1.通过new对象实现反射机制
(1) obj.getClass(); //通过Object类的getClass方法来获取
2.通过类名实现反射机制
(1)类名.class; //使用类名加“.class”的方式即会返回与该类对应的Class对象
3.通过路径实现反射机制
3. 使用Class.forName方法
Class有一个著名的static方法 forName:
public static Class forName(String className) throws ClassNotFoundException
该方法可以根据字符串参数所指定的类名(即路径)获取与该类关联的Class对象。
该方法声明抛出ClassNotFoundException异常。顾名思义,当该方法无法获取需要装入的类时(例如,在当前类路径中不存在这个类),就会抛出这个异常。

例子:

public class Get {

	//获取反射机制三种方式

	public static void main(String[] args) throws ClassNotFoundException {

		//方式一(通过建立对象)

		Student stu = new Student();

		Class classobj1 = stu.getClass();

		System.out.println(classobj1.getName());

//方式二(所在通过路径-相对路径)

	Class classobj2 = Class.forName("fanshe.Student");

	System.out.println(classobj2.getName());

//方式三(通过类名)

	Class classobj3 = Student.class;

	System.out.println(classobj3.getName());

}

}

4.简单工厂模式
客户端不需要负责创建对象
如果有新对象增加,需要修改工厂类
Factory(工厂角色):工厂角色即工厂类,它是简单工厂模式的核心,负责实现创建所有产品实例的内部逻辑
Product(抽象产品角色):它是工厂类所创建的所有对象的父类,封装了各种产品对象的公有方法。(一般为抽象类或接口)
ConcreteProduct(具体产品角色):它是简单工厂模式的创建目标,所有被创建的对象都充当这个角色的某个具体类的实例。
客户端通过工厂类来创建一个产品类的实例,而无须直接使用new关键字来创建对象。
简而言之,就是具体产品角色具体于抽象产品角色,然后由工厂角色为具体产品角色(一个类)创建许多对象。

5.java.lang.Class:代表一个类
getName():获得类的完整名字。
getFields():获得类的public类型的属性。
getDeclaredFields():获得类的所有属性。
getMethods():获得类的public类型的方法。
getDeclaredMethods():获得类的所有方法。
getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。
newInstance():通过类的不带参数的构造方法创建这个类的一个对象。
即:
Method method = clazz.getMethod(" 方法名字","方法的参数类型'); //按声明顺序标识该方法形参类型
invoke(Object obj,Object···args):利用指定参数args操作指定对象中的该方法,返回值类型是object。method.invoke(" 要调用的方法的名字所隶属的对象实体",方法的参数值)
在通过getFilelds()getMethods()方法依次获得权限为public的成员变量和方法时,其中包含从超类继承到的成员变量和方法。
而通过getDeclaredFields()getDeclaredMethods()方法获得所有权限的成员变量和方法时只能获得本类中的。

6.public final Class getClass()
所有Java对象都具备这个方法,该方法用于返回调用该方法的对象的所属类关联的Class对象。

7.静态的方法属性初始化,是在加载类的时候初始化。而非静态方法属性初始化,是new类实例对象的时候加载。
故静态方法可以由类直接调用,而不用实例化成对象后再调用。

8.实例化Class类对象(四种方法)

(1)

前提:若已知具体的类,通过类的class属性获取,该方法

最为安全可靠,程序性能最高

实例:Class clazz = String.class;

(2 前提:已知某个类的实例,调用该实例的getClass()方法获取Class对象

实例:

Class clazz = “student”.getClass();

(3)前提:已知一个类的全类名,且该类在类路径下,可通过Class类的静态方法forName()获取,可能抛出ClassNotFoundException

实例:Class clazz = Class.forName(“java.lang.String”);

4)其他方式

ClassLoader cl = this.getClass().getClassLoader();


Class clazz4 = cl.loadClass(“类的全类名”);

9.newInstance()也是用来创建新的对象,其与new()的区别是:
newInstance():弱类型,效率低,只能调用无参构造(只能创建object类型的对象)
new():强类型,高效率,能调用任何public构造器

你可能感兴趣的:(JAVA反射机制课堂知识点总结)