一、定义
反射:反射机制实在【运行状态】中:
对于任意一个类,都能够知道这个类的多有属性和方法;
对于任意一个对象,都能够调用他的任意一个方法和属性;
二、反射提供的功能
在运行时判断任意一个对象所属的类;
在运行时构造任意一个类的对象;
在运行时判断任意一个类所具有的成员变量和方法;
在运行时调用任意一个对象的方法
生成动态代理
三、获取反射对象(入口)
1、Class.forName(包名+类名);
Class<?> perClass=Class.forName(reflect.Person);
2、类名.class
Class<?> perClass=Person.class;
3、对象.getClass ()
Person per=new Person();
Class<?> perClass=per.getClass();
三、反射获取方法
1、获取公共方法,用.getMethod()
公共的意思:1、本类以及父类,接口中的所有方法 2、访问修饰符为public
public static void Demo1(){
Class<?> perClass=null
try{
perClass=Class.forName("reflect.People");
}catch(ClassNotFoundException e){
e.printStackTrace();
}
//获取公共方法
Method[] methods=perClass.getMethod();
//遍历数组打印公共方法
for(Method e:methods){
System.out.println(e);
}
}
2、获取当前类的所有方法 .getDeclaredMethods()
public static void Demo2(){
Class<?> perClass=null
try{
perClass=Class.forName("reflect.People");
}catch(ClassNotFoundException e){
e.printStackTrace();
}
//获取当前类的所有方法 包括private修饰的
Method[] methods1=perClass.getDeclaredMethod();
//遍历数组打印当前类的所有方法
for(Method e:methods1){
System.out.println(e);
}
}
3.获取所有构造方法 .getConstructors()
public static void Demo3(){
Class<?> perClass=null
try{
perClass=Class.forName("reflect.People");
}catch(ClassNotFoundException e){
e.printStackTrace();
}
//获取所有的构造方法
Method[] methods2=perClass.getConstructors();
//遍历数组打印构造方法
for(Method e:methods2){
System.out.println(e);
}
}
4.获取接口 .getInterfaces()
public static void Demo3(){
Class<?> perClass=null;
//拿入口推荐Class.forName()
try {
perClass=Class.forName("relfect.Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//通过getInterface()方法拿到接口
Class<?>[] interfaces=perClass.getInterfaces();
//遍历接口
for(Class<?> e:interfaces){
System.out.println(e);
}
}
5.获取父类 .getSuperClass()
public static void Demo4(){
Class<?> perClass=null;
//拿入口推荐Class.forName()
try {
perClass=Class.forName("relfect.Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//获取父类
Class<?> superclass=perClass.getSuperclass();
//打印父类
System.out.println(superclass);
}
6.获取所有公共属性 .getFileds()
public static void Demo6(){
Class<?> perClass=null;
//拿入口推荐Class.forName()
try {
perClass=Class.forName("relfect.Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//拿属性
Field[] fields=perClass.getFields();
//遍历属性
for(Field e:fields){
System.out.println(e);
}
}
7.获取所有属性 .getDeclaredFileds()
//获取所有属性
Field[] fields1=perClass.getDeclaredFields();
for (Field e:fields1){
System.out.println(e);
}
8.获取当前反射所属类和接口的对象 .newInstance
Object instance=perClass.newInstance;
//将实例强转为Person 调用Person中的方法来证明成功
People per=(People)perClass.newInstance;
per.方法();
总结:获取反射的三种方法 Class.forName() 类名.class 对象名.getClass()
Java是单继承,多实现。所有只能继承一个类,可以实现多个接口!!!!
获取公共方法·getMethods1)
当前类的所用方法 ·get Declared Methods()
获取所有构造方法 ·getConstructors()
获取公共属性..getFields()
获取所有属性.getDeclaredFields()获取所有接口 ·getInterfaces( )
获取父类 ·getSupercloss( )
获取当前代表类对象 ·hewInstance()