编程技术是改变世界的力量。
本站
当前位置:网站首页 > 后端语言 > 正文

Java反射详解及总结 java 反射

gowuye 2024-04-04 11:57 3 浏览 0 评论

反射就是指在运行状态中获取任意类的名称、package信息、所有属性、方法、注释、类型、类加载器等

可以使用或者改变对象的属性判断一个对象的类。

Jdk里面的Class这个类就是提供反射的核心

Class类的详细

Class类的实例表示运行的java程序和接口,就是说jvm里面存在每个类的的Class对象。

Class类没有构造方法。当Class对象在加载虚拟机时通过类加载器中的defineclass方法自动构造。

Class类常用方法使用

获取Class对象的三种方式

//第一种new产生一个User对象,一个Class对象
        User user = new User();
        Class c1 = user.getClass();//获取这个Class对象
        System.out.println(c1.getName());
        //第二种
        Class c2 = User.class;
        System.out.println(c1.equals(c2));//判断俩种方法获取的对象是否是同一个
        //第三种
        Class c = Class.forName("com.kyf.ClassStudy.User");//使用物理路径获取
        System.out.println(c.equals(c2));//看是否是一个对象

运行结果

com.kyf.ClassStudy.User
true
true

证明在运行期间一个类只会产生一个Class对象

反射获取构造方法

System.out.println("===============所有公有构造方法=============");
        Constructor[] constructors = c.getConstructors();
        for (Constructor constructor : constructors) {
            System.out.println(constructor);
        }
        System.out.println("===============所有构造方法=============");
        Constructor[] declaredConstructors = c.getDeclaredConstructors();
        for (Constructor declaredConstructor : declaredConstructors) {
            System.out.println(declaredConstructor);
        }
        System.out.println("===============所有公有、无参数构造方法=============");
        System.out.println(c.getConstructor(null));
        c.getConstructor(null).newInstance();

        System.out.println("===============所有私有构造方法,并调用=============");
        Constructor declaredConstructor = c.getDeclaredConstructor(int.class);
        System.out.println(declaredConstructor);
//        调用构造方法
        declaredConstructor.setAccessible(true);//忽略访问修饰符
        declaredConstructor.newInstance(12);

getConstructor(Class... parameterTypes

返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。 parameterTypes 参数是 Class 对象的一个数组,这些 Class 对象按声明顺序标识构造方法的形式参数类型。

要反映的构造方法是此 Class 对象所表示的类的公共构造方法,其形式参数类型与 parameterTypes 所指定的参数类型相匹配。

getConstructors()

返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。如果该类没有公共构造方法,或者该类是一个数组类,或者该类反映一个基本类型或 void,则返回一个长度为 0 的数组。

getDeclaredConstructor(Class... parameterTypes

返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。 parameterTypes 参数是 Class 对象的一个数组,它按声明顺序标识构造方法的形式参数类型。

getDeclaredConstructors()

返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。它们是公共、保护、默认(包)访问和私有构造方法。返回数组中的元素没有排序,也没有任何特定的顺序。如果该类存在一个默认构造方法,则它包含在返回的数组中。如果此 Class 对象表示一个接口、一个基本类型、一个数组类或 void,则此方法返回一个长度为 0 的数组。

newInstance()

创建此 Class 对象所表示的类的一个新实例。如同用一个带有一个空参数列表的 new 表达式实例化该类。如果该类尚未初始化,则初始化之。

运行结果

===============所有公有构造方法=============
public com.kyf.ClassStudy.User(java.lang.String,int)
public com.kyf.ClassStudy.User(char)
public com.kyf.ClassStudy.User()
===============所有构造方法=============
private com.kyf.ClassStudy.User(int)
public com.kyf.ClassStudy.User(java.lang.String,int)
public com.kyf.ClassStudy.User(char)
protected com.kyf.ClassStudy.User(boolean)
public com.kyf.ClassStudy.User()
com.kyf.ClassStudy.User(java.lang.String)
===============所有公有、无参数构造方法=============
public com.kyf.ClassStudy.User()
公有无参构造
===============所有私有构造方法,并调用=============
private com.kyf.ClassStudy.User(int)
私有
age=12

反射获取变量

getField(String name)

返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。 name 参数是一个 String ,用于指定所需字段的简称。

getFields()

返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。返回数组中的元素没有排序,也没有任何特定的顺序。如果类或接口没有可访问的公共字段,或者表示一个数组类、一个基本类型或 void,则此方法返回长度为 0 的数组。

getDeclaredField(String name)

返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。 name 参数是一个 String ,它指定所需字段的简称。注意,此方法不反映数组类的 length 字段。

getDeclaredFields()

返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段,包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段。返回数组中的元素没有排序,也没有任何特定的顺序。如果该类或接口不声明任何字段,或者此 Class 对象表示一个基本类型、一个数组类或 void,则此方法返回一个长度为 0 的数组。

变量调用需要 Object o = c.getConstructor().newInstance(); 来产生对象。 设置属性这需要获取的属性对象来调用.set(object,“参数”)方法,第一个参数设置对象,第二个用来传参

System.out.println("===============所有公共属性=============");
        Field[] fields = c.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }
        System.out.println("===============所有属性=============");
        Field[] declaredFields = c.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
        }
        System.out.println("===============所有公共属性并调用=============");
        Field name = c.getField("name");
        System.out.println(name);
        Object o = c.getConstructor().newInstance();
        name.set(o,"张三");
        User u = (User) o;
        System.out.println("验证名字"+u.name);
        System.out.println("===============所有私有属性并调用=============");
        Field phone = c.getDeclaredField("phone");
        System.out.println(phone);
        phone.setAccessible(true);
        phone.set(o,"12345678911");
        System.out.println("电话验证"+u);

运行结果

===============所有公共属性=============
public java.lang.String com.kyf.ClassStudy.User.name
===============所有属性=============
public java.lang.String com.kyf.ClassStudy.User.name
char com.kyf.ClassStudy.User.sex
protected int com.kyf.ClassStudy.User.age
private java.lang.String com.kyf.ClassStudy.User.phone
===============所有公共属性并调用=============
public java.lang.String com.kyf.ClassStudy.User.name
公有无参构造
验证名字张三
===============所有私有属性并调用=============
private java.lang.String com.kyf.ClassStudy.User.phone
电话验证User{name='张三', sex= , age=0, phone='12345678911'}

反射获取方法

Method show4 = c.getDeclaredMethod("show4",int.class);

制定方法,第一个参数是方法名称,第二个是类型名称

show4.setAccessible(true);

解除私有属性

Object invoke = show4.invoke(o1, 20);

对获取的对象传入参数第一个对象,第二个参数

并且获取返回值

System.out.println("===============获取所有公共方法=============");
        Method[] methods = c.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }
        System.out.println("===============获取所有方法=============");
        Method[] declaredMethods = c.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            System.out.println(declaredMethod);
        }
        System.out.println("===============获取公共show1方法=============");
        System.out.println(c.getMethod("show1", String.class));
        Object o1 = c.getConstructor().newInstance();
        c.getMethod("show1", String.class).invoke(o1,"张三");

        System.out.println("===============获取私有show4方法=============");
        Method show4 = c.getDeclaredMethod("show4",int.class);
        System.out.println(show4);
        show4.setAccessible(true);
        Object invoke = show4.invoke(o1, 20);
        System.out.println("返回值="+invoke);

运行结果

===============获取所有公共方法=============
public static void com.kyf.ClassStudy.User.main(java.lang.String[])
public java.lang.String com.kyf.ClassStudy.User.toString()
public void com.kyf.ClassStudy.User.show1(java.lang.String)
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
===============获取所有方法=============
public static void com.kyf.ClassStudy.User.main(java.lang.String[])
public java.lang.String com.kyf.ClassStudy.User.toString()
public void com.kyf.ClassStudy.User.show1(java.lang.String)
private java.lang.String com.kyf.ClassStudy.User.show4(int)
void com.kyf.ClassStudy.User.show3()
protected void com.kyf.ClassStudy.User.show2()
===============获取公共show1方法=============
public void com.kyf.ClassStudy.User.show1(java.lang.String)
公有无参构造
我是公有的方法,有参数张三
===============获取私有show4方法=============
private java.lang.String com.kyf.ClassStudy.User.show4(int)
我是私有的方法还带返回值
返回值=abcd

Main方法获取

Method main = c.getMethod("main", String[].class);
        main.invoke(null,(Object) new String[]{});

运行结果

mian方法执行.......

使用反射跨越泛型检查

List<String> list = new ArrayList();
        list.add("abc");
        list.add("def");
        Class listClass = list.getClass();
        Method add = listClass.getMethod("add", Object.class);
        add.invoke(list,123);
        for (Object obj : list) {
            System.out.println(obj);
        }

运行结果

abc
def
123

相关推荐

PHPMailer远程命令执行漏洞分析

摘要:PHPMailer是一个强大的PHP编写的邮件发送类,但近日被爆出远程命令执行漏洞,该漏洞实际上是什么,有何种影响,本文对该漏洞进行了分析及验证方法,并给出防护方案。0x00漏洞概要PHPMa...

「安全漏洞」DedeCMS-5.8.1 SSTI模板注入导致RCE

漏洞类型SSTIRCE利用条件影响范围应用漏洞概述2021年9月30日,国外安全研究人员StevenSeeley披露了最新的DedeCMS版本中存在的一处SQL注入漏洞以及一处SSTI导致的RCE...

回顾使用PHP原生发送电子邮件(终)文件附件

FileAttachments文件附件Fileattachmentsworkjustlikemixedemail,exceptthatadifferentcontenttyp...

php-fpm.conf &amp; php.ini 安全优化实践

0x01关于php其历史相对已经比较久远了,这里也就不废话了,属弱类型中一种解释型语言除了web开发以及写些简单的exp,暂未发现其它牛逼用途,暂以中小型web站点开发为主另外,低版本的php自身...

linux 安全配置 ossec 开源检测

linux安全配置ossec开源检测一:介绍主要功能有日志分析、完整性检查、rootkit检测、基于时间的警报和主动响应。除了具有入侵检测系统功能外,它还一般被用在SEM/SIM(安全事件管理(...

PHP使用PHPMailer发送验证码邮件的方法与调用逻辑

首先我们需要下载PHPMailer:https://github.com/PHPMailer/PHPMailer一般情况下我们只需要压缩包中的src文件夹中的文件,并保存至根目录即可:设置一个文件,如...

回顾使用PHP原生发送电子邮件(一)

IwishIcouldremembertheveryfirstemailmessageIeversent.Unfortunately,thetruthisthatI...

PHPMAILER实现PHP发邮件功能php实例

这篇文章主要为大家详细介绍了PHPMAILER实现PHP发邮件功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下本文实例为大家分享了PHPMAILER实现PHP发邮件功能的具体代码,供大家参考,具...

500道网络安全面试题集锦(附答案)

本篇文章内容为网络安全各个方向涉及的面试题,星数越多代表问题出现的几率越大,但是无论如何都无法覆盖所有的面试问题,更多的还是希望由点达面,查漏补缺,然后祝各位前程似锦,都能找到自己满意的工作!一、We...

网站放家里,随处看电影「Apache+php+ssl 安装和配置」

  使用5G网络,随处都可以看到放自己家里电脑的视频。这个功能很容易实现,不需要太多的专业知识,也不需要额外花钱。如果确实需要,最多花不到两百块钱买一台旧电脑放家里,做个网站,就能解决全部问题,Fre...

Windows2008中 Magic Winmail Server提权

MagicWinmailServer是安全易用全功能的邮件服务器软件,不仅支持SMTP/POP3/IMAP/Webmail/LDAP(公共地址簿)/多域/发信认证/反垃圾邮件/邮件过滤/邮件组...

利用PHPmailer发送邮件

早上帮朋友做一个收集客户联系方式的页面,要求能实时推送信息给管理员。刚开始想到做后台管理,因为时间紧,做后台是赶不上了。想过通过短信发送,成本太高,否决了。。。灵机一动,客户提交时直接把信息发送到邮箱...

phpmailer发送邮件

phpmailer发送邮件PHP内置的mail函数使用起来不够方便,另外受其他语言的影响,博主更偏好面向对象的包管理模式,因此phpmailer成为了我用PHP发送邮件的首选,这里分享给大家。库导入这...

PHP初级教程:读取输入

PHP读取输入:Form:?formaction="welcome.php"method="post">Name:(inputtype="text...

php filter 验证Email,Url,Ip格式

今天发现一个非常好用的函数东西,filter过滤器,用于验证和过滤来自非安全来源的数据,比如用户的输入。验证Email:$email='1234567@qq.com';if(!filter_v...

取消回复欢迎 发表评论: