反射
反射:
jdk1.5引入
优点:
提高java代码的灵活性,使java语言从静态语言 变为半动态语言.
没有学反射时创建对象:
先创建类,在类中定义属性方法,使用new创建对象,
反射使用场景:
1,使用第三方库,可以创建对象,但不知道对象拥有的属性与方法,想要获取,就需要通过反射获取.
2,使用第三方法类库,只知道类名,不知道类名,不知道类中有什么,可以通过反射获取使用
3,使用第三方类库,只知道报名与类名,但是操作,可以用到反射进行操作
类对象
1.一个类被jvm加载时,会生成类对象
注意:
1.一个类只会被jvm加载一次,所以一个类的类对象只有一个.
2.通过new关键字创建出来的对象,称为类的对象,又名实例对象,与类对象不是一个.(需要区分清楚).
3.类对象中包含该类的属性,方法,构造函数,父类,父接口,注解等信息,
获取类对象的方式
方式1
通过类的实例对象获取类对象
实例对象.getClass();
方式2
通过类名获取类对象
类名.class
方式3
通过Class类提供的静态方法获取
Class.forname("包名.类名");
三种方式实际使用:
Student student = new Student();
Class class1 = student.getClass();
Class class2= Student.class;
Class class3 = Class.forName("com.jlf.getclass.Student");
类对象的常用方法
概述:
获取该类的信息:
获取类的全名称(包名+类名)
String name = class3.getName();
获取类加载器
ClassLoader loader = class3.getClassLoader();
获取父类
Class superclass = class3.getSuperclass();
获取父接口(接口可以多个)
Class[] interfaces = class3.getInterfaces();
获取其包
Package package1 = class3.getPackage();
package1.getName();
通过类对象创建类的实例对象
Object object = class3.newInstance();
Student student = (Student)object;
获取属性:
Filed
Field[] fields = class1.getFields();
Field[] fields2 = class1.getDeclaredFields();
Field field = class1.getDeclaredField("name");
field.setAccessible(true);
获取构造函数
获取公共构造函数
Constructor[] constructors = class1.getConstructors();
获取所有构造函数
Constructor[] constructors2 = class1.getDeclaredConstructors();
获取指定构造函数(只有与参数不同)
Constructor<Student> constructor01 = class1.getDeclaredConstructor(参数列表的类对象列表);
eg://获取两/三参构造函数
Constructor<Student> constructor02 = class1.getDeclaredConstructor(String.class,String.class,String.class);
获取方法:
获取公共方法
Method[] methods = c.getMethods();
获取所有方法
Method[] methods2 = c.getDeclaredMethods();
获取指定方法
Method getDeclaredMethod(String name,... p)
参数一:方法名
参数二:该方法形参列表对应的类对象列表
eg:Method m2 = c.getDeclaredMethod("setAge",String.class);
获取注解
Filed(属性)
常用方法
修改对象属性值
void set(对象,修改后的值)
//略过访问权限修饰符
field.setAccessible(true);
获取对象属性的值
Object get()
//获取指定属性
Field field = class1.getDeclaredField("指定的属性名");
Constructor(构造函数)
常用方法:
//通过构造函数创建对象
newInstance(实参列表);
eg:
Student student2 = constructor02.newInstance("18","焦龙飞","男");
//忽略访问权限修饰符
void setAccessible(true);
Method(方法)
常用方法:
//忽略访问权限修饰符
void setAccessible(true);
//执行方法
Object invoke(Object obj, Object... args)
执行方法
m2:方法
s1:执行m2方法的列表
m2.invoke(s1 );