反射笔记1.0(加油)

反射笔记1.0(加油),第1张

文章目录
  • 一、反射的简介
    • 为什么使用反射:
    • 反射的作用
  • 二、反射获取类对象:
    • 1.getClass()
    • 2.forName()
    • 3.T.class(T是任意的java类型,包括void关键字)
  • 三、反射获取类对象信息的方法
    • 获取Filed
    • 获取Method
    • 获取constructor(构造器)
      • 这里需要介绍一下newInstance();
      • 这里需要介绍一下setAccessible();
    • invoke and setAccessible的使用。
  • 总结


一、反射的简介 为什么使用反射:

例如当我们在写javaweb的工程时,tomcat是早就写好的,你无法在tomcat中通过人工的方式new出对象,tomcat无法知道此时程序员创建的servlet的类名,这时就需要用到反射。

反射的作用

通过非new的方式生成对象。java反射机制实在运行状态中,对于任意一个类,都能知道这个类的的所有属性和方法。对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取信息以及动态调用对象的方法的功能被称为java的反射机制。

二、反射获取类对象: 1.getClass()

Object类中的getClass()方法将会返回一个Class类型的实例
Class c1 = student.getClass();
常用的Class方法是getName;这个方法将会返回类的名字。

System.out.println(c1.getName);
//结果为:Student
2.forName()

通过调用静态方法forName获得类名对应的Class对象。

String className="java.util.Random";
Class c2=Class.forName(className);
3.T.class(T是任意的java类型,包括void关键字)
Class cl1=int.class;
Class cl2=Double[].class;
T.class代表匹配的类对象。
三、反射获取类对象信息的方法 获取Filed
getField();//获取指定的public类型的全局变量。
getFields();//获取所有的public类型的全局变量信息(包括子类的public全局变量)。
getDeclaredField()//忽略访问修饰符,获取类当中指定的全局变量信息。
getDeclaredFields()//获取类当中所有的全局变量信息。(只包含本类的全局变量)
*set(Object,value);Object:对象 --》只有先创建对象才能给变量赋值。(有了对象才有地方存储变量的值)
*get(Object)获取当前变量在对象中保存的的值。
 Class student =Student1.class;
        Field[] fields=student.getDeclaredFields();
        for(Field field:fields){
            System.out.println("Declared="+field);
        }
        System.out.println("----------");
        Field[] fields1=student.getFields();
        for(Field field:fields1){
            System.out.println(field);
        }
        System.out.println("----------");
        Field age = student.getField("age");
        System.out.println(age);

        System.out.println("-----------");
        Field name=student.getDeclaredField("name");
        System.out.println(name);

获取Method
getMethod()
getMethods()
getDeclaredMethods()
getDeclaredMethod();getDeclaredMethod(String.class,arg...);//获取类当中指定的方法。
invoke()--》执行方法;
 Method[] methods=student.getMethods();
        for(Method method:methods){
            System.out.println(method);
        }
        System.out.println("-----------");
        Method[]methods1=student.getDeclaredMethods();
        for(Method method:methods1){
            System.out.println(method);
        }
        System.out.println("------------");
        Method method=student.getMethod("run", String.class);
        System.out.println(method);

获取constructor(构造器)
getConstructor(args....)
getDeclaredConstructor(args.....)
getConstructors()
getDeclaredConstructors()
*newInstance(Object...initarges)//利用获取的构造器来创建对象

Class student=Student1.class;
        Constructor constructor=student.getDeclaredConstructor(String.class);
        System.out.println(constructor);
        constructor.setAccessible(true);
        Student1 student1=(Student1)constructor.newInstance("张三");
        System.out.println(student1.age);
        System.out.println("-------------------0");

这里需要介绍一下newInstance();

newInstance(Object…initarges)//利用获取的构造器来创建对象,如果调用的构造器需要有入参,则在后面的括号中加入参数。

这里需要介绍一下setAccessible();

暴力反射----》忽略private类型的检测(任何时候调用private类型)
setAccessible(true).当后面的参数为true时,可以访问private修饰类型。

invoke and setAccessible的使用。

	Constructor constructor=student.getDeclaredConstructor(String.class);
	constructor.setAccessible(true);
	Student1 student1=(Student1)constructor.newInstance("张三");
//Field
        Field sex=student.getDeclaredField("sex");
        sex.setAccessible(true);
        sex.set(student1,2);
        System.out.println(sex.get(student1));
        System.out.println("----------------");
        Field age=student.getField("age");
        age.set(student1,20);
        System.out.println(age.get(student1));
        System.out.println("-----------------");
        //method
        System.out.println(student1.getName());
        System.out.println("-----------");
        Method method=student.getDeclaredMethod("setName", String.class);
        method.setAccessible(true);
        method.invoke(student1,"xxx");
        System.out.println(student1.getName());

总结

以上就是今天学习反射的全部知识,本文只是介绍了反射的一些相关用法。
后续会更新更深层讲解。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/langs/721797.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存