反射的好处:大大的增强了程序的扩展性。
反射的基本步骤:
1)获得Class对象,就是获取到指定的名称的字节码文件对象。
2)实例化对象,获得类的属性、方法或构造函数。
3)访问属性、调用方法、调用构造函数创建对象。
获取类对象的方式(三种)
1. 类名.class
Class c = Student.class;
Class i = int.class();//8种基本数据类型也有类对象
2. getClass()方法(Object类定义)
以前讲的获取对象的实际类型(不准确),应该是获得某个类的类对象
Student s = new Student();
Class cs1 = s.getClass();
Class cs2 = Student.class;
不管是类的什么对象,不管以什么方式,获得的都是同一个类对象
3.Class.forName()方法
public static Class forName(String className) throwsClassNotFoundException
Class c = Class.forName(“ex04.Student”);//全限定名
Class.forName():类加载方法
类对象的作用
1. 类对象的作用——获得类信息
2. 常用方法
1) getName():获得类的名称,包括包名
2)getSimpleName():获得类的名称,不包括包名
3) getSuperClass():获得本类的父类的类对象
4) getInterfaces():获得本类所实现的所有接口的类对象
3. 方法
1) public Method[] getDeclaredMethods()throws SecurityException
2) public Method[] getMethods()throws SecurityException
3) Method(java.lang.reflect.Method)
4) 获得对象的方法
i.获得所有的公开方法(包括本类和继承)
ii.获得所有的本类中定义的方法(公开、私有方法都能获得)
4. 属性
1) Field[] getDeclaredFields();
2)Field[] getFields();
3) Field:属性,也称字段,属性信息包括修饰符、类型、属性名
4)获得对象的属性
i.获得所有的公开属性(包括父类)
ii. 获得本类中定义的属性
5.使用类对象创建类的对象
反射包
1.java.lang.reflect.Field类
通过Class对象的如下方法可以获得Field对象
FieldgetDeclaredField(String name);//name:属性名
FieldgetField(String name)
Field[]getDeclaredField();
Field[]getField()
Class:java.lang.Class
Field类的常用方法
i.getName();//获得属性
ii. 属性赋值、获取
public void set(Objectobj,Objectvalue);
public Objectget(Object obj);
iii. public void Accessible(booleanflag)
直接操作私有属性,打破封装
2.java.lang.reflect.Method类
通过Class对象的如下方法可以获得Method对象
public Method[] getDeclaredMethods();
public Method[] getMethods();
public Method getMethod(String name,Class[] parameterTypes);
public Method getDeclaredMethod(String name,Class[]parameterTypes);
1) Student类
2) 通过调用Method.invoke(Object,Object[])执行方法;
3.java.lang.reflect.Constructor类
通过Class对象的如下方法可以获得Constructor对象
Constructor[]getConstructors();
Constructor[]getDeclaredConstructors();//可以获得私有的构造方法
Constructor getConstructor(Class[]parameters);
ConstructorgetDeclaredConstructor(Class[] parameters);