首页
留言
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
页面
留言
搜索到
34
篇与
java
的结果
2023-02-20
Java 注解
Java 注解注解(Annotation)就是Java代码里的特殊标记,比如:@Override、@Test等,作用是:让其他程序根据注解信息来决定怎么执行该程序。注意:注解可以用在类上、构造器上、方法上、成员变量上、参数上等位置自定义注解自己定义注解value: 特殊属性,只有一个value参数(或者其他参数有默认值)可以直接省略value写值模板: public @interface 注解名称{ public 属性类型 属性名() default 默认值; }案例@interface MyTest1 { String aaa(); boolean bbb() default true; String[] ccc(); } @interface MyTest2 { String value(); //特殊属性,只有一个value参数(或者其他参数有默认值)可以直接省略value写值 } @interface MyTest3 { String value(); //特殊属性,只有一个value参数(或者其他参数有默认值)可以直接省略value写值 int age() default 1; } @MyTest1(aaa = "类注解",ccc = {"a","b","c"}) public class AnnotationTest1 { @MyTest1(aaa = "函数注解",ccc = {"aa","bb","cc"}) public void test1(){ } @MyTest2("只有一个value参数(或者其他参数有默认值)可以直接省略value写值2") public void test2(){ } @MyTest3("只有一个value参数(或者其他参数有默认值)可以直接省略value写值3") public void test3(){ } }注解的原理可以查看注解编译后的文件,本质上是接口,里面写的一些属性都是抽象方法字节码文件@interface MyTest1 { String aaa(); boolean bbb() default true; String[] ccc(); } @interface MyTest2 { String value(); } @interface MyTest3 { String value(); int age() default 1; }元注解指的是修饰注解的注解常见的元注解:@Target、@Retention@Target 声明被修饰的注解只能在哪些位置使用@Target(ElementType.TYPE)TYPE,类,接口FIELD,成员变量METHOD,成员方法PARAMETER,方法参数CONSTRUCTOR,构造器LOCAL_VARIABLE,局部变量@Target(ElementType.TYPE) // 当前被修饰的注解只能在类上使用 @interface MyTest4{ } @Target({ElementType.TYPE,ElementType.METHOD}) // 当前被修饰的注解只能在类和方法上使用 @interface MyTest5{ }@Retention 声明注解的保留周期@Retention()SOURCE 只作用在源码阶段,字节码文件中不存在CLASS(默认值) 保留到字节码文件阶段,运行阶段不存在RUNTIME(开发常用) 一直保留到运行阶段@Retention(RetentionPolicy.SOURCE)//只作用在源码阶段,字节码文件中不存在 @interface MyTest6 { } @Retention(RetentionPolicy.CLASS)//保留到字节码文件阶段,运行阶段不存在 @interface MyTest7 { } @Retention(RetentionPolicy.RUNTIME)//一直保留到运行阶段 @interface MyTest8 { }注解的解析判断类上、方法上、成员变量上是否存在注解,并把注解里的内容给解析出来使用反射package Annotations; import java.lang.annotation.*; import java.lang.reflect.Method; import java.util.Arrays; @Target({ElementType.METHOD,ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @interface MyTestAnnotation { String value(); double aaa() default 100; String[] bbb(); } @MyTestAnnotation(value = "类注解",aaa = 99.5,bbb = {"a","b"}) class TestClass { @MyTestAnnotation(value = "方法注解",aaa = 199.5,bbb = {"b","a"}) public void test1(){ } } public class MyTestClass{ public static void main(String[] args) throws Exception{ { // 1.获取class对象 Class c = TestClass.class; // 2.解析类上的注解 // 判断类上是否包含了某个注解 if (c.isAnnotationPresent(MyTestAnnotation.class)){ MyTestAnnotation myTestAnnotation = (MyTestAnnotation) c.getDeclaredAnnotation(MyTestAnnotation.class); System.out.println(myTestAnnotation.value()); System.out.println(myTestAnnotation.aaa()); System.out.println(Arrays.toString(myTestAnnotation.bbb())); } } System.out.println("--------------------------"); { // 1.获取class对象 Class c = TestClass.class; Method m = c.getDeclaredMethod("test1"); // 2.解析方法上的注解 // 判断方法上是否包含了某个注解 if (m.isAnnotationPresent(MyTestAnnotation.class)){ MyTestAnnotation myTestAnnotation = (MyTestAnnotation) m.getDeclaredAnnotation(MyTestAnnotation.class); System.out.println(myTestAnnotation.value()); System.out.println(myTestAnnotation.aaa()); System.out.println(Arrays.toString(myTestAnnotation.bbb())); } } } }输出结果类注解 99.5 [a, b] -------------------------- 方法注解 199.5 [b, a]
2023年02月20日
101 阅读
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 点赞
2023-02-20
Java 二分查找(折半查找)
Java 二分查找(折半查找)二分查找的前提:必须是排序好的数据折半的条件:min<=max public static boolean towSearch(int[] a,int search){ int min = 0; int max = a.length - 1; int mid = (min + max) / 2; int i = 0; while (min <= max){ System.out.println("第 " + ++i + " 次查找"); if (search == a[mid]){ return true; } if (search < a[mid]){ max = mid - 1; mid = (min + max) / 2; } if (search > a[mid]){ min = mid + 1; mid = (min + max) / 2; } } return false; } public static void main(String[] args) { int[] a = {1,2,3,4,5,6,7,8,9,10}; int search = 3; System.out.println(towSearch(a,3)); }结果第 1 次查找第 2 次查找true
2023年02月20日
108 阅读
0 评论
0 点赞
2023-02-20
Java 选择排序
Java 选择排序从0索引开始,拿着每一个索引上的元素跟后面的元素依次比较 public static void main(String[] args) { int[] a = {5,4,2,1,3,6,8,9,10}; for (int i = 0; i < a.length - 1; i++) { for (int j = i + 1; j < a.length; j++) { if (a[i] > a[j]){ a[i] = a[i] ^ a[j]; a[j] = a[i] ^ a[j]; a[i] = a[i] ^ a[j]; } } } System.out.println(Arrays.toString(a)); }结果[1, 2, 3, 4, 5, 6, 8, 9, 10]
2023年02月20日
140 阅读
0 评论
0 点赞
1
...
4
5
6
7