首页
留言
Search
1
在Centos7下搭建Socks5代理服务器
1,036 阅读
2
在windows11通过Zip安装Mysql5.7
574 阅读
3
Mysql5.7开放远程登录
482 阅读
4
数据库
469 阅读
5
mysql5.7基本命令
377 阅读
综合
正则表达式
git
系统
centos7
ubuntu
kali
Debian
网络
socks5
wireguard
运维
docker
hadoop
kubernetes
hive
openstack
ElasticSearch
ansible
前端
三剑客
Python
Python3
selenium
Flask
PHP
PHP基础
ThinkPHP
游戏
我的世界
算法
递归
排序
查找
软件
ide
Xshell
vim
PicGo
Typora
云盘
安全
靶场
reverse
Java
JavaSE
Spring
MyBatis
C++
QT
数据库
mysql
登录
Search
标签搜索
java
centos7
linux
centos
html5
JavaScript
php
css3
mysql
spring
mysql5.7
linux全栈
ubuntu
BeanFactory
SpringBean
python
python3
ApplicationContext
kali
mysql8.0
我亏一点
累计撰写
139
篇文章
累计收到
8
条评论
首页
栏目
综合
正则表达式
git
系统
centos7
ubuntu
kali
Debian
网络
socks5
wireguard
运维
docker
hadoop
kubernetes
hive
openstack
ElasticSearch
ansible
前端
三剑客
Python
Python3
selenium
Flask
PHP
PHP基础
ThinkPHP
游戏
我的世界
算法
递归
排序
查找
软件
ide
Xshell
vim
PicGo
Typora
云盘
安全
靶场
reverse
Java
JavaSE
Spring
MyBatis
C++
QT
数据库
mysql
页面
留言
搜索到
4
篇与
反射
的结果
2023-02-20
Java 动态代理
Java 动态代理程序为什么需要代理?对象如果嫌身上干的事情太多,可以通过代理来转移部分职责对象有什么方法写被代理,代理就一定要有对应的方法定义接口public interface Star { String sing(String name); void dance(); }定义继承接口重写类public class BigStar implements Star{ private String name; public BigStar(String name){ this.name = name; } public String sing(String name){ System.out.println(this.name + "正在唱" + name); return "谢谢!谢谢"; } public void dance(){ System.out.println(this.name + "正在跳舞"); } }主方法运行import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class Main { public static void main(String[] args) { Star star = new BigStar("小明"); /* ClassLoader loader,Class<?>[] interfaces,InvocationHandler h 参数1:用于指定一个类加载器 参数2:指定生成的代理长什么样子,有哪些方法 参数3:用来指定生成的代理对象要干什么事情 */ Star starProxy = (Star) Proxy.newProxyInstance(BigStar.class.getClassLoader(), BigStar.class.getInterfaces(), (Object proxy, Method method, Object[] args1) -> { if (method.getName().equals("sing")){ System.out.println("准备话筒"); }else if (method.getName().equals("dance")){ System.out.println("准备场地"); } return method.invoke(star,args1); }); starProxy.dance(); String text = starProxy.sing("好日子"); System.out.println(text); } }结果输出准备场地 小明正在跳舞 准备话筒 小明正在唱好日子 谢谢!谢谢
2023年02月20日
120 阅读
0 评论
0 点赞
2023-02-20
Java 注解作用与应用场景
Java 注解作用与应用场景模拟Junit框架需求:定义若干个方法,只要加了MyTest注解,就会触发该方法执行。分析:定义一个自定义注解MyTest,只能注解方法,存活范围是一直都在。定义若干个方法,部分方法加上@MyTest注解修饰,部分方法不加模拟一个junit程序,可以触发加了@MyTest注解方法执行package frame; import java.lang.annotation.ElementType; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.lang.annotation.Retention; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @Target(ElementType.METHOD) //注解只能在方法使用 @Retention(RetentionPolicy.RUNTIME) //让注解可以一直存活 @interface MyTest { } public class DEMO { // @MyTest private void test1(){ System.out.println("-----test1-----"); } @MyTest public void test2(){ System.out.println("-----test2-----"); } // @MyTest public void test3(){ System.out.println("-----test3-----"); } @MyTest private void test4(){ System.out.println("-----test4-----"); } public static void main(String[] args) throws InvocationTargetException, IllegalAccessException { Class demoClass = DEMO.class; DEMO demo = new DEMO(); Method[] declaredMethods = demoClass.getDeclaredMethods(); for (Method declaredMethod : declaredMethods) { if (declaredMethod.isAnnotationPresent(MyTest.class)){ declaredMethod.setAccessible(true); declaredMethod.invoke(demo); } } } }运行结果-----test2----- -----test4-----
2023年02月20日
113 阅读
0 评论
0 点赞
2023-02-20
Java 反射作用与应用场景
Java 反射作用与应用场景反射的作用基本使用:可以得到一个类的全部成分然后操作可以破坏封装性最重要的用途是:适合做java的框架,基本上,主流的框架都会基于反射设计出一些通用的功能。案例使用反射做一个简易版的框架对于任意一个对象,该框架都可以把对象的字段名和对应的值,保存到文件中去。实现代码: public class frame { class Student{ private String name; private int age; private char sex; private double height; private String hobby; Student(String name, int age, char sex, double height, String hobby) { this.name = name; this.age = age; this.sex = sex; this.height = height; this.hobby = hobby; } } class Teacher{ private String name; private double salary; Teacher(String name, double salary) { this.name = name; this.salary = salary; } } public static void save(Object obj) throws IllegalAccessException, FileNotFoundException { // 打开io文件写入流 PrintStream printStream = new PrintStream(new FileOutputStream("1.txt",true)); // obj 是任意对象,到底有多少个字段要保存 Class c = obj.getClass(); printStream.println("-----------" + c.getSimpleName() + "-----------"); // 从这个类中提取它的全部成员变量 Field[] fields = c.getDeclaredFields(); // 遍历每个成员变量 for (Field field : fields) { // 破坏权限检查 field.setAccessible(true); // 取值 String name = field.getName(); String value = String.valueOf(field.get(obj)); // 写入文件 printStream.println(name + " = " + value); } // 关闭io文件写入流 printStream.close(); } public static void main(String[] args) throws NoSuchFieldException, FileNotFoundException, IllegalAccessException { System.out.println("创建学生变量"); Student student = new frame().new Student("张三",18,'男',170.1,"学生"); System.out.println("写入信息到文本"); save(student); System.out.println("创建教师变量"); Teacher teacher = new frame().new Teacher("李四",5000); save(teacher); System.out.println("写入信息到文本"); } }执行结果创建学生变量 写入信息到文本 创建教师变量 写入信息到文本文本输出(1.txt)-----------Student----------- name = 张三 age = 18 sex = 男 height = 170.1 hobby = 学生 this$0 = Reflection.frame@b4c966a -----------Teacher----------- name = 李四 salary = 5000.0 this$0 = Reflection.frame@1d81eb93
2023年02月20日
129 阅读
0 评论
0 点赞
2023-02-20
Java 反射
Java 反射反射(Reflection)反射就是:加载类,并且允许以编程的方式解剖类中的各种成分(成员变量、方法、构造器等)。获取类的信息并且操作类1.反射第一步:加载类,获取类的字节码:Class对象2.获取类的构造器:Constructor对象3.获取类的成员变量:Field对象4.获取类的成员方法:Method对象获取Class对象的三种方式Class c1 = 类名.class调用Class提供方法:public static Class forName(String package);Object提供的方法:public Class getClass(); Class c3 = 对象.getClass(); public static void main(String[] args) throws ClassNotFoundException { Class c1 = Object.class; System.out.println(c1.getName()); System.out.println(c1.getSimpleName()); Class c2 = Class.forName("java.lang.Object"); System.out.println(c1==c2); Object obj = new Object(); Class c3 = obj.getClass(); System.out.println(c3 == c2); }运行结果java.lang.Object Object true true定义Students类 class Student{ private String name; private int age; public int publicName; public Student(){ System.out.println("无参构造"); } public Student(int a){ System.out.println("有参构造"); } Student(int a,int b){ System.out.println("default修饰有参构造"); } private Student(int a, int b, int c){ System.out.println("private修饰有参构造"); } public String getName() { return name; } public void setName(String name) { this.name = name; } private void run(){ System.out.println("私密方法运行"); } }获取类的构造器 public class Reflection { public static void getAll(){ // 1.反射第一步:必须得到这个类的Class对象 Class<Student> c = Student.class; // 2.获取类的全部构造器 // getConstructors只能获取public修饰的全部构造器 // Constructor[] constructors = c.getConstructors(); // getDeclaredConstructors可以获取所有存在的构造器 Constructor[] constructors = c.getDeclaredConstructors(); // 3.遍历数组中的每个构造器对象 for (Constructor constructor : constructors){ System.out.println(constructor.getName() + "---->" + constructor.getParameterCount()); } } public static void getOne() throws Exception { // 1.反射第一步:必须得到这个类的Class对象 Class c = Student.class; // 2.获取类的某个构造器 // getConstructor只能获取public修饰的单个构造器 // Constructor<Student> constructor = c.getConstructor(); // getDeclaredConstructor可以单个存在的构造器 Constructor constructor = c.getDeclaredConstructor(); System.out.println(constructor.getName() + "---->" + constructor.getParameterCount()); // 3.获取有参数构造器 Constructor constructor1 = c.getDeclaredConstructor(int.class); System.out.println(constructor1.getName() + "---->" + constructor1.getParameterCount()); } public static void main(String[] args) throws Exception { getAll(); System.out.println("----------------------"); getOne(); } }运行结果study.Student---->3 study.Student---->2 study.Student---->1 study.Student---->0 ---------------------- study.Student---->0 study.Student---->1类构造器的作用setAccessible(true)禁止检查访问控制(可以破坏封装性)newInstance()执行构造器的方法 public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { Class c = Student.class; Constructor constructor = c.getDeclaredConstructor(); constructor.newInstance(); Constructor constructor1 = c.getDeclaredConstructor(int.class,int.class,int.class); constructor1.setAccessible(true); constructor1.newInstance(1,2,3); }运行结果无参构造 private修饰有参构造获取类的成员变量setAccessible(true)禁止检查访问控制(可以破坏封装性)set 赋值get 取值 public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { // 1.反射第一步:必须是先得到类的Class对象 Class studentClass = Student.class; System.out.println(studentClass.getName()); System.out.println("------------------------"); // 2.获取类的全部成员变量 // getFields获取类的全部public修饰的成员变量 Field[] publicFields = studentClass.getFields(); for (Field field : publicFields){ System.out.println("public成员变量:" + field.getName() + "--->" + field.getType()); } System.out.println("------------------------"); // getDeclaredFields获取类的全部存在成员变量 Field[] Fields = studentClass.getDeclaredFields(); for (Field field : Fields){ System.out.println("所有成员变量:" + field.getName() + "--->" + field.getType()); } System.out.println("------------------------"); // 3.定位某个成员变量 { Field field = studentClass.getDeclaredField("name"); System.out.println("所有成员变量:" + field.getName() + "--->" + field.getType()); System.out.println("------------------------"); // 赋值 Student student = new Student(); field.setAccessible(true); // 禁止访问控制权限 field.set(student,"暴力赋值"); System.out.println(student.getName()); System.out.println("------------------------"); //取值 String name = (String) field.get(student); System.out.println(name); } }运行结果------------------------ public成员变量:publicName--->int ------------------------ 所有成员变量:name--->class java.lang.String 所有成员变量:age--->int 所有成员变量:publicName--->int ------------------------ 所有成员变量:name--->class java.lang.String ------------------------ 无参构造 暴力赋值 ------------------------ 暴力赋值获取类的成员方法setAccessible(true)禁止检查访问控制(可以破坏封装性)invoke(),执行方法,括号内必须传入类的对象 public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { Class c = Student.class; // getMethods获取所有public修饰的成员方法 Method[] publicMethods = c.getMethods(); // getDeclaredMethods获取所有存在的成员方法 Method[] methods = c.getDeclaredMethods(); for (Method method : methods) { System.out.println(method.getName() + "----" + method.getParameterCount() + "----" + method.getReturnType()); } System.out.println("-------------------------"); Student student = new Student(); Method run = c.getDeclaredMethod("run"); run.setAccessible(true); run.invoke(student); System.out.println("-------------------------"); Method setName = c.getDeclaredMethod("setName", String.class); setName.invoke(student,"方法赋值"); Method getName = c.getDeclaredMethod("getName"); System.out.println(getName.invoke(student));; }运行结果getName----0----class java.lang.String run----0----void setName----1----void ------------------------- 无参构造 私密方法运行 ------------------------- 方法赋值
2023年02月20日
121 阅读
0 评论
0 点赞