packagecom.xjz.reflection;importjava.lang.reflect.Constructor;importjava.lang.reflect.InvocationTargetException;/**
* @author xjz_2002
* @version 1.0
* 演示通过反射机制创建实例
*/publicclassReflecCreateInstance{publicstaticvoidmain(String[] args)throwsClassNotFoundException,IllegalAccessException,InstantiationException,NoSuchMethodException,InvocationTargetException{//1. 先获取 User 类的 Class 对象Class<?> userClass =Class.forName("com.xjz.reflection.User");//2. 通过 public的无参构造器创建实例Object o = userClass.newInstance();System.out.println(o);//3. 通过 public 的有参构造器创建实例/*
constructor 对象就是
public User(String name) {//public 的有参构造器
this.name = name;
}
*///3.1 先得到对应构造器Constructor<?> constructor = userClass.getConstructor(String.class);//3.2 创建实例,并传入实参Object xjz = constructor.newInstance("xjz");System.out.println("xjz="+ xjz);//4. 通过非 public 的有参构造器创建实例//4.1 得到 private 的构造器对象Constructor<?> constructor2 = userClass.getDeclaredConstructor(int.class,String.class);//4.2 创建实例//暴破【暴力破解】,使用反射可以访问 private 构造器/方法/属性,反射面前,都是纸老虎
constructor2.setAccessible(true);Object user2 = constructor2.newInstance(100,"张杰");System.out.println("user2="+ user2);}}classUser{// User 类privateint age =10;privateString name ="xjz_2002";publicUser(){//无参 public}publicUser(String name){//public 的有参构造器this.name = name;}privateUser(int age,String name){//private 有参构造器this.age = age;this.name = name;}@OverridepublicStringtoString(){return"User[age"+ age +", name="+ name +']';}}
7. 通过反射访问类中的成员
7.1 访问属性 ReflecAccessProperty.java
packagecom.xjz.reflection;importjava.lang.reflect.Field;/**
* @author xjz_2002
* @version 1.0
* 演示反射操作属性
*/publicclassReflecAccessProperty{publicstaticvoidmain(String[] args)throwsClassNotFoundException,IllegalAccessException,InstantiationException,NoSuchFieldException{//1. 得到 Student 类对应的 Class 对象Class<?> stuClass =Class.forName("com.xjz.reflection.Student");//2. 创建对象Object o = stuClass.newInstance();// o 的运行类型是 StudentSystem.out.println(o.getClass());//Student//3. 使用反射得到 age 属性对象Field age = stuClass.getField("age");
age.set(o,21);//通过反射来操作属性System.out.println(o);System.out.println(age.get(o));//返回 age属性的值//4. 使用反射操作 name 属性Field name = stuClass.getDeclaredField("name");//对 name 进行暴破,可以操作 private 属性
name.setAccessible(true);// name.set(o,"老徐");
name.set(null,"老徐");//因为 name 是 static 属性,因此 o 也可以写出 nullSystem.out.println(o);System.out.println(name.get(o));//获取属性值System.out.println(name.get(null));//获取属性值,要求 name 是 static}}classStudent{//类publicint age;privatestaticString name;publicStudent(){//构造器}@OverridepublicStringtoString(){return"Student[age="+ age +",name="+ name +']';}}
7.2 访问方法 ReflecAccessMethod.java
packagecom.xjz.reflection;importjava.lang.reflect.InvocationTargetException;importjava.lang.reflect.Method;/**
* @author xjz_2002
* @version 1.0
* 演示通过反射调用方法
*/publicclassReflecAccessMethod{publicstaticvoidmain(String[] args)throwsClassNotFoundException,IllegalAccessException,InstantiationException,NoSuchMethodException,InvocationTargetException{//1. 得到 Boos 类对应的 Class 对象Class<?> bossCls =Class.forName("com.xjz.reflection.Boss");//2. 创建对象Object o = bossCls.newInstance();//3. 调用 public 的 hi 方法//Method hi = bossCls.getMethod("hi", String.class);//3.1 得到 hi 方法对象Method hi = bossCls.getDeclaredMethod("hi",String.class);//3.2 调用
hi.invoke(o,"张国荣");//4. 调用 private static 方法//4.1 得到 say 方法对象Method say = bossCls.getDeclaredMethod("say",int.class,String.class,char.class);//4.2 因为 say 方法是 private,所有需要暴破,原理和前面的构造器和属性一样
say.setAccessible(true);System.out.println(say.invoke(o,21,"xjz",'男'));//4.3 因为 say 方法是 static的,还可以这样调用,可以传入 nullSystem.out.println(say.invoke(null,22,"tom",'女'));//5. 在反射中,如果方法有返回值,统一返回 Object,但是他运行类型和方法定义的返回类型一致Object reVal = say.invoke(null,300,"王五",'男');System.out.println("reVal 的运行类型="+ reVal.getClass());//String//再演示一个返回的案例Method m1 = bossCls.getDeclaredMethod("m1");Object reVal2 = m1.invoke(o);System.out.println("reVal2 =运行类型="+ reVal2.getClass());//Monster}}classMonster{}classBoss{//类publicint age;privatestaticString name;publicBoss(){//构造器}publicMonsterm1(){returnnewMonster();}privatestaticStringsay(int n,String s,char c){//静态方法return n +" "+ s +" "+ c;}publicvoidhi(String s){//普通 public 方法System.out.println("hi "+ s);}}
目录 Spring Boot 与 Web开发Spring Boot 与 MavenJava 环境搭建下载JDK下载xmapp下载navicat for mysql下载Eclipse配置tomcat配置maven 新建Spring Boot项目 Spring Boot 与 Web开发
Spring Boot 是一种用于简化 Spring 应用程序开发、部署和运行的框架,而 Web 开…
代码如下:
public class MyWork {public static void main(String[] args) throws IOException{BufferedReader fr new BufferedReader(new FileReader("myfile/abc.txt"));BufferedWriter fw new BufferedWriter(new FileWriter("myfile/test.tx…
mysql中执行insert、update、delete报错:Column Count Doesnt Match Value Count at Row 1 的解决方案
通常情况:字段不匹配
如:student有id, name, age字段
-- 错误写法
INSERT INTO student VALUES(5,horse)-- 正确写法
INSERT INTO stu…
文章目录 什么是 CASCAS 的应用如何使用 CAS 操作实现自旋锁CAS 的 ABA 问题CAS 相关面试题 什么是 CAS
CAS(Compare and Swap)是一种原子操作,用于在无锁情况下保证数据一致性的问题。它包含三个操作数——内存位置、预期原值及更新值。在执…