铁子们今天分享的是反射的运用
老规矩学习之前先看思维导图
目录
一:反射
二:类类
三:反射实例化
编辑
四:反射动态方法调用
五:反射读取属性
一:反射
什么是反射呢
1,定义:反射是JAVA语言中一种机制,通过该机制可以动态的实例化对象,读取属性,以及调用方法
2.作用
框架是基于反射+设计模式组合的一个半成品
所以反射可以用于组建框架。
为什么要学反射?
java的反射机制就是增加程序的灵活性,避免将代码写的太死,使其更灵活
二:类类
什么是类类?
举个通俗易懂的例子:比如老六是狗类的实例化对象,张三是学生类的实例化对象、而狗类和学生类以及其他所有的类又是类类的实例 所以说类类就是其他类的上一级,其他类就是类类的实例
2.类类的三种获取方式
①类.class
②类实例.getClass()
③Class.forName("类的全路径名");
案例 如下:
)package com.tsq.reflect;
public class Demo1 {
public static void main(String[] args) throws Exception {
// 类.class
Class clazz = Student.class;
// 类实例.getClass()
Student stu = new Student();
Class clazz2 = stu.getClass();
// Class.forName("类的全路径名")
Class.forName("com.zhw.reflect.Student");
}
}
效果如下
三:反射实例化
1、getConstructor
2、getDeclaredConstructor
3、newInstance
package com.tsq.reflect;
import java.lang.reflect.Constructor;
public class Deml2 {
public static void main(String[] args) throws Exception, IllegalAccessException {
Student stu1 = new Student();
Student stu2=new Student("s001");
Student stu3 = new Student("s001","张三");
//获取类类
Class extends Student> clz1 = stu1.getClass();
// 默认就是调用无参共有的
// 1.无参数 共有的方法
Student stu4 = clz1.newInstance();
// 2.有参共有构造方法
// 拿到构造器对象3个2个1个n个参数~~>拿到一个String的构造器对象
Constructor extends Student> c1 = clz1.getConstructor(String.class);
Student stu5 = c1.newInstance("s001");
// 3有多个参数共有的构造方法拿到那两个参数的构造器对象
Constructor extends Student> c2 = clz1.getConstructor(String.class);
Student stu6 = c2.newInstance("s001","李四");
// 4私有的构造方法
// getconstructor只能够获取共有的构造方法 要获取私有的构造 器
Constructor extends Student> c3 = clz1.getDeclaredConstructor(Integer.class);
c3.setAccessible(true);
Student stu7 = c3.newInstance(18);
}
}
效果如下
四:反射动态方法调用
1、getMethod
2、getDeclaredMethod
package com.tsq.reflect;
import java.lang.reflect.Method;
public class deml3 {
public static void main(String[] args) throws Exception{
// 1先拿到类类
Classclz= Student.class;
//name:方法名 parametypes :方法调用的实参
Method m1 = clz.getMethod("hello");
// 3.调用对应方法
// 第一个参数 那个类实力 第二个参数 :方法 顶用实的实参
Object invoke = m1.invoke(clz.newInstance());
System.out.println(invoke);
//1个有参 共有方法
Method m2 = clz.getMethod("hello", String.class);
Object invoke2 = m2.invoke(clz.newInstance(), "张三");
System.out.println(invoke2);
//调用私有方法
Method m3 = clz.getDeclaredMethod("add", Integer.class,Integer.class);
m3.setAccessible(true);
Object invoke3 = m3.invoke(clz.newInstance(), 5,5);
System.out.println(invoke3);
}
}
效果如下
五:反射读取属性
1、getDeclaredField
2、getDeclaredFields
package com.tsq.reflect;
import java.lang.reflect.Field;
public class Demo4 {
public static void main(String[] args) throws Exception {
Student stu = new Student("s003","张三");
stu.age=20;
// 需求 拿到学生所有属性
System.out.println("agd:"+stu.age);
System.out.println("sname"+stu.getSname());
System.out.println("sid"+stu.getSid());
Class extends Student> clz = stu.getClass();
//当前类所有属性对象
Field[] fields = clz.getDeclaredFields();
System.out.println(fields.length);
//循环中的代表每一个属性
for (Field f : fields) {
//打开权限
f.setAccessible(true);
//通过属性对象拿到名称
System.out.println(f.getName());
//、拿到当前属性对象名称
System.out.println( f.get(stu));
}
}
}
效果如下
好了本次分享到此结束了我们下次见面拜拜



