前言必读

读者手册(必读)_云边的快乐猫的博客-CSDN博客

一、名词解释

1.什么是Java反射机制?

答:运行时动态获得类信息以及动态调取类中的成分的能力

2.反射的步骤(重点):

反射的第一步都是先得到编译后的class对象,然后就可以得到class的全部成分。

二、代码实践

1.获取类的class对象

获取类的class对象有三种方式,这里只写最简单的一种方式

步骤:

Class 自定义 = 类名.class

例子:

被测试的Dog类

package learn;
public class Dog {
}

测试类

package learn;public class Test {public static void main(String[] args) {//类名.classClass dog = Dog.class;//获取System.out.println(dog);//打印}
}

运行结果:

class learn.Dog

==================================================================================================== 

2.获取类的构造器对象

被测试的类(里面有有参、无参构造器、set和get方法、toSrring方法)

package learn;
public class Dog {private String name;private int age;//被测试类里面放有参和无参构造器和set、get方法public String getName() {//getreturn name;}public void setName(String name) {//setthis.name = name;}public int getAge() {//getreturn age;}public void setAge(int age) {//setthis.age = age;}public Dog() {System.out.println("无参构造器执行");}//重写toString,快捷键里面有:Alt+Insert  作用:返回打印的值@Overridepublic String toString() {return "Dog{" +"name='" + name + '\'' +", age=" + age +'}';}public Dog(String name, int age) {System.out.println("有参构造器执行");this.name = name;this.age = age;}
}

获取构造器有4种

(1)只能获取public修饰的(略)

(2)全部都可以获取(学习这个)

测试类

package learn;import java.lang.reflect.Constructor;public class Test {public static void main(String[] args) throws NoSuchMethodException {//1.获取类对象Class dog = Dog.class;//2.提取类对象中的全部构造器对象Constructor[] a = dog.getDeclaredConstructors();//3.用for循环遍历全部的构造器对象for (Constructor constructor : a) {//打印构造器里面的参数个数。0个代表构造器参数为0,是无参构造器        2个代表构造器有两个参数,是有参构造器System.out.println(constructor.getName()+"=====>"+constructor.getParameterCount());//learn.Dog=====>0     learn.Dog=====>2}}
}

运行结果:

learn.Dog=====>0
learn.Dog=====>2

(3)只能获取某个单一的public修饰的构造器(略)

(4)可以获取某个单一的构造器

测试类

package learn;import java.lang.reflect.Constructor;public class Test {public static void main(String[] args) throws Exception {//1,获取类对象Class dog = Dog.class;//获取单个无参构造器对象个数Constructor cons = dog.getDeclaredConstructor();System.out.println(cons.getName()+"===>"+cons.getParameterCount());//如果遇到了私有的构造器,进行暴力破解打开权限cons.setAccessible(true);//最后获取无参构造器对象Dog a  = (Dog)cons.newInstance();System.out.println(a);System.out.println("================分割线==========================");//获取单个有参构造器对象Constructor cons1= dog.getDeclaredConstructor(String.class,int.class);//被获取的成员变量是什么数据类型,这里就填什么数据类型System.out.println(cons1.getName()+"===>"+cons1.getParameterCount());//参数一是:获取Dog类名称,参数二:获取参数的个数//最后获得有构造参数Dog a1  = (Dog)cons1.newInstance("大哥",18);//传入赋值参数System.out.println(a1);}
}

运行结果:

learn.Dog===>0
无参构造器执行
Dog{name='null', age=0}
================分割线==========================
learn.Dog===>2
有参构造器执行
Dog{name='大哥', age=18}

==================================================================================================== 

3.获取类的成员变量

步骤:

1.获取class对象

2.获取Field对象

3.赋值或者获取值

(1)获取全部成员变量

被测试的类

package learn;
public class Dog {private  String name;private int age;//被测试类里面放有参和无参构造器和set、get方法public String getName() {//getreturn name;}public void setName(String name) {//setthis.name = name;}public int getAge() {//getreturn age;}public void setAge(int age) {//setthis.age = age;}public Dog() {System.out.println("无参构造器执行");}//重写toString,快捷键里面有:Alt+Insert  作用:返回打印的值@Overridepublic String toString() {return "Dog{" +"name='" + name + '\'' +", age=" + age +'}';}public Dog(String name, int age) {System.out.println("有参构造器执行");this.name = name;this.age = age;}
}

测试类

package learn;import java.lang.reflect.Field;public class Test extends PeopleTest{public static void main(String[] args)  {//1.获取class对象Class dog = Dog.class;//2.获取全部成员变量Field[] fields = dog.getDeclaredFields();//3.用for循环遍历出来for (Field field : fields) {//4.参数一:获取具体成员变量  参数二:获取成员类型System.out.println(field.getName()+"====>"+field.getType());}}
}

运行结果:

name====>class java.lang.String
age====>int

(2)获取某个成员变量

被测试的类(上一个测试类)

测试类

package learn;import java.lang.reflect.Field;public class Test extends PeopleTest{public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {//一、获取某个成员变量//1.获取class对象Class dog = Dog.class;//2.获取某个成员变量---ageField field = dog.getDeclaredField("age");//遇到异常抛出就好//3.暴力打开权限field.setAccessible(true);//赋值Dog d = new Dog();//new要赋值的类field.set(d,18);//把获取到的成员变量放到新new出来的里面  赋值18System.out.println(d);//取值Object o = field.get(d);System.out.println(o);}
}

运行结果:

无参构造器执行
Dog{name='null', age=18}
18

==================================================================================================== 

4.获取类的方法 

步骤:

1.获取类的对象

2. 用getDeclaredMethods获取全部方法或者getDeclaredMethod获取某个方法

3.用for循环遍历出来

遍历.getName()-----获取方法名字

遍历.getReturnType()--获取方法返回值的类型

遍历.getParameterCount()--获取方法个数

如果获取某个就不用遍历和需要暴力破解,在第二步时候不一样,其他的基本一样

(1)获取全部方法

被测试的类 

package learn;
public class Dog {//自定义的成员变量private  String name;public int age;//生成的有参构造public Dog(String name) {this.name = name;}//狗跑的方法public void run(){System.out.println("狗在跑");}//狗在吃东西的方法public String eat(){System.out.println("我会吃");return "吃的很开心";}
//生成的set和get方法public String getName() {return name;}public void setName(String name) {this.name = name;}
}

 测试类

package learn;
import java.lang.reflect.Method;public class Test extends PeopleTest{public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {//1.获取类的对象Class c = Dog.class;//2.获取全部方法(包括私有)---用getDeclaredMethods方法获取Method[] methods = c.getDeclaredMethods();//遍历全部方法for (Method method : methods) {System.out.println(method.getName()+"这是方法的名字"+method.getReturnType()+"这是返回值类型"+method.getParameterCount()+"参数个数");}}
}

运行结果:

getName这是方法的名字class java.lang.String这是返回值类型0参数个数
run这是方法的名字void这是返回值类型0参数个数
setName这是方法的名字void这是返回值类型1参数个数
eat这是方法的名字class java.lang.String这是返回值类型0参数个数

(1)获取某个方法

被测试的类(上一个测试类)

测试类

package learn;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class Test extends PeopleTest{public static void main(String[] args) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {//1.获取类的对象Class c = Dog.class;//2.获取某个方法Method m = c.getDeclaredMethod("run");//获取run方法,遇到异常直接抛出//暴力打开权限m.setAccessible(true);//3.触发方法的执行Dog d = new Dog();//注意:如果没有方法返回来的,那么就会返回nullObject invoke = m.invoke(d);System.out.println(invoke);}
}

运行结果:

狗在跑
null

旁白:反射就是先通过获取类的对象,然后再根据需要看获取构造方法、成员变量或者方法,根据需要获取,一般全部获得用得都是数组方式,用到的方法里面会含有一个s。而用到暴力打开私有权限的最多的就是获取单一某个成员变量时候了。反射还有一个擦除泛型的,就是破坏泛型原则的,目前这篇文章里面主要讲的就是破坏封装性的。

java反射(暴力破解)相关推荐

  1. 如何在Windows平台用Java代码暴力破解WIFI密码

    开始进入正题.在网上找了很多wifi破解工具,都是linux平台下用的,然后还不支持虚拟机装linux.因为很多笔记本装虚拟机都识别不了内置网卡.所以得把系统刻到U盘,然后用U盘启动.但是我现在穷得连 ...

  2. java防止暴力破解用户名的5种常见方法

    系统的账号密码如果被破解了,对我们的整个系统都是巨大隐患. 通常情况下,我们会使用以下方法阻止黑客破解账号密码: 1.网站管理入口禁止使用弱口令帐号,建议使用复杂口令,比如:大小写字母与数字的组合,口 ...

  3. 蓝桥信用卡号验证 JAVA纯暴力破解

    1.从卡号最后一位数字开始,逆向将奇数位(1.3.5等等)相加. 2.从卡号最后一位数字开始,逆向将偶数位数字, 先乘以2(如果乘积为两位数,则将其减去9),再求和. 3.将奇数位总和加上偶数位总和, ...

  4. Java版 凯撒密码 加密、解密、暴力破解

    Java版 凯撒密码 加密.解密.暴力破解 用Java实现凯撒密码的 '加密' 和 '解密' 工作 代码实现如下: 代码片 package com.hellow.demo;import java.ut ...

  5. 反射(二) :整型数组能存字附---反射”暴力“超越数据类型的检测

    package twelve;import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; ...

  6. 【韩顺平】Java反射机制笔记

    文章目录 1.前言 2.一个需求引出反射 3.反射机制 3.1 Java Reflection 3.2 反射机制原理图 3.3 反射机制可以完成的功能 3.4 反射相关的主要类 3.5 反射优点和缺点 ...

  7. Java反射02--Filed,Method,Constructor类

    Java反射02–Filed,Method,Constructor类 一Filed类常用方法 上一篇已经说过了Field对象的创建,下面回顾下,同时介绍下Filed类的常用方法. 测试类如下: pub ...

  8. Java 反射机制快速入门及常见方法全归纳。

    目录 一.反射机制 1.基本介绍 2.原理示意图 3.反射基本代码实现 4.反射性能 二.Class 类 1.基本介绍 2.获取 Class类对象的方式 3.有 Class对象的类 三.类加载 1.基 ...

  9. 什么叫做类的类?如何获取私有的方法?Java反射机制太强大了,详解Java反射机制【Java养成】

    Java学习打卡:第二十二天 内容导航 Java学习打卡:第二十二天 内容管理 Java反射机制 问题引入---数据库介绍 Java反射的介绍 class的使用 由字符串产生类和对象 获取一个类的所有 ...

最新文章

  1. 福布斯 : 企业市场Chrome任重道远
  2. Linux-Apache和PHP结合
  3. 在windows下安装PyPdf2
  4. 字符串后面去0、补0
  5. python总结函数图像_PIL使用小结(crop和paste函数)
  6. 通讯录c语言以文本文件保存,学C三个月了,学了文件,用C语言写了个通讯录程序...
  7. Unity3D实践1:摄像机跟随
  8. 【东师软工】第二次成绩排行榜
  9. tomcat 7 无法打开管理页面
  10. Java结构型设计模式之装饰者模式
  11. Windows cmd常用命令
  12. 如何开启显示文件后缀名(扩展名)
  13. 161张Menhera酱表情包 无水印汉化版
  14. UGUI 实现屏幕外怪物的指示箭头
  15. 对 Go2 错误处理提案的批判
  16. 乐视2(X620)刷机日记
  17. AtCoder Beginner Contest 214(补题)
  18. meta http-equiv=Content-Type content=text/html; charset=gb2312设置中文显示
  19. CameraLink备忘录
  20. 8880 e7 v2配什么主板_Xeon E7 v2系列21款产品详解_Intel服务器CPU_服务器评测与技术-中关村在线...

热门文章

  1. 2021CFA一级二级三级预测 结合十余年实践总结
  2. 区块链的架构是如何定义的?
  3. Linux cgroup详解(理论与实例)
  4. 判断2064年是不是闰年。 闰年判断规则: 能被400整除的是闰年( 2000年是闰年) 能被4整除,不能被100整除的是闰年(2004年是闰年) 其他的不是闰年(1900年不是闰年)
  5. 国外主机搭php访问慢_针对海外云服务器访问速度慢的解决方案
  6. 游戏老虎吃绵羊 -- lua
  7. R语言实现冗余分析(RDA)完整代码
  8. linux安装微软雅黑等字体
  9. 恩智浦智能车核心板LPC54606PCB原理图
  10. POJ2187 Beauty Contest(凸包+对踵点对求解)