反射的实现

1.获取类的字节码对象
//获取类的字节码对象
public class Demo1 {public static void main(String[] args) throws ClassNotFoundException {//方式1:类名.ClassClass<?> clazz1 = Student.class;//方式2:对象名.getClass()Student student = new Student();Class<?> clazz2 = student.getClass();//方式3:Class.forName("类的全路径名")Class<?> clazz3 = Class.forName("com.itheima1.Student");System.out.println(clazz1);System.out.println(clazz1 == clazz2);System.out.println(clazz2 == clazz3);}
}
2.获取Constructor【构造方法】对象

学生类

public class Student {private String name;private int age;//公共的无参构造方法public Student() {System.out.println("public...Student...无参构造方法");}//公共的有参构造方法public Student(String name, int age) {System.out.println("name的值为:" + name + "age的值为" + age);System.out.println("public...Student...有参构造方法");}//私有的有参构造方法private Student(String name) {this.name= name ;System.out.println("name的值为:" + name);System.out.println("private...Student...有参构造方法");}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}

获取Constructor对象的方法

//获取Constructor对象
public class Demo1 {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {//首先得到Class对象再调用方法Class<?> clazz = Class.forName("com.itheima2.Student");//Constructor<T> getConstructor (class<?>... parameterTypes):返回单个公共构造方法对象【只能返回公共的,默认的等也不行】//Constructor<?> constructor = clazz.getConstructor();//constructor<T> getDeclaredConstructor (class<?>... parameterTypes):返回单个构造方法对象【可以返回私有的】Constructor<?> declaredConstructor = clazz.getDeclaredConstructor(String.class, int.class);System.out.println(declaredConstructor);//Constructor<?>[] getConstructors ():返回所有公共构造方法对象的数组Constructor<?>[] constructors = clazz.getConstructors();for (Constructor<?> constructor : constructors) {System.out.println(constructor);}//Constructor<?>[] getDeclaredConstructors ():返回所有构造方法对象的数组//Constructor<?>[] declaredConstructors = clazz.getDeclaredConstructors();}
}打印结果:
-------------------------------------------------------------------------------------
public com.itheima2.Student(java.lang.String,int)
public com.itheima2.Student(java.lang.String,int)
public com.itheima2.Student()
2.1 Constructor对象的使用

根据指定的构造方法创建对象:
Class.newInstance();只能反射无参的构造器,需要构造器可见;
Constructor.newInstance();可以反射任何构造器,可以反射私有构造器

//反射获取Constructor对象并使用
//T newInstance (object. . . initargs):根据指定的构造方法创建对象
public class Demo2 {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {//1.获取Class对象Class<?> clazz = Class.forName("com.itheima2.Student");//2.获取构造方法对象【四种方法】Constructor<?> constructor1 = clazz.getDeclaredConstructor(String.class);//访问私有【其他修饰都能使用】的构造不能直接使用,getDeclaredConstructor()只能做访问//constructor.setAccessible(true):在创建学生对象之前临时取消访问检查【暴力反射】constructor1.setAccessible(true);//3.利用newInstance创建Student的对象Student student = (Student) constructor1.newInstance("张三");System.out.println(student);System.out.println("---------------------------------------------------------");//简写格式【不能获取私有方法,其他都可,默认访问空参构造】//1.获取Class对象Class<?> clazz1 = Class.forName("com.itheima2.Student");//2.在Class类中,有一个newInstance方法,可以利用空参直接创建一个对象【已过时,做了解】Student student1 = (Student) clazz1.newInstance();System.out.println(student1);}
}c
name的值为:张三
private...Student...有参构造方法
Student{name='张三', age=0}
---------------------------------------------------------
public...Student...无参构造方法
Student{name='null', age=0}
3.获取Field【成员变量】对象

学生类

public class Student {public String name;public int age;public String gender;private int money = 300;
}

获取Field【成员变量】对象的方法

//获取Field【成员变量】对象的方法
public class Demo1 {public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {Class<?> clazz = Class.forName("com.itheima4.Student");//Field[] getFields ():返回所有公共成员变量对象的数组//Field[] fields = clazz.getFields();//Field[] getDeclaredFields ():返回所有成员变量对象的数组Field[] declaredFields = clazz.getDeclaredFields();for (Field declaredField : declaredFields) {System.out.println(declaredField);}// Field getField (string name):返回单个公共成员变量对象// 想要获取的成员变量必须是真实存在的//且必须是public修饰的Field f1 = clazz.getField("name");System.out.println(f1);// Field getDeclaredField (string name):返回单个成员变量对象Field f2 = clazz.getDeclaredField("money");System.out.println(f2);}
}打印结果:
-------------------------------------------------------------------------------------
public java.lang.String com.itheima4.Student.name
public int com.itheima4.Student.age
public java.lang.String com.itheima4.Student.gender
private int com.itheima4.Student.money
public java.lang.String com.itheima4.Student.name
private int com.itheima4.Student.money
3.1 Field对象的使用

根据指定的构造方法创建对象:
void set (object obj, object value):给obj对象的成员变量赋值为value【如果私有则需要暴力反射】
object get (object obj)返回由该 Field表示的字段在指定对象上的值

//利用Field对象,获取值或者修改值
public class Demo2 {public static void main(String[] args) throws ReflectiveOperationException {// 1.获取class对象Class<?> clazz = Class.forName("com.itheima4.Student");//2.获取name这个Field对象Field f1 = clazz.getDeclaredField("name");Field f2 = clazz.getDeclaredField("age");Field f3 = clazz.getDeclaredField("money");f3.setAccessible(true);f1.setAccessible(true);//由于私有则需要暴力反射[在对象创建之前]//创建学生类的对象【如果空参构造私有,则要对成员方法暴力反射】Student student = (Student) clazz.getConstructor().newInstance();//3.利用set方法进行赋值//void set (object obj, object value):给obj对象的成员变量赋值为valuef2.set(student, 20);f1.set(student, "张三");//等价于obj.setNome("张三");//4.获取属性值//object get (object obj)返回由该 Field表示的字段在指定对象上的值System.out.println(f1.get(student));System.out.println(f2.get(student));System.out.println(f3.get(student));}
}打印结果:
-------------------------------------------------------------------------------------
张三
20
300
4 获取Method【成员方法】对象

学生类

public class Student {//有一个参数的show方法public void show(String n) { System.out.println("show..." + n); }//有两个参数的show方法private void show(String n, int m) {System.out.println("show..." + n +"..."+ m);}//有两个参数,有返回值的方法public int sum(int n, int m) {return m + n;}
}

反射获取学生类成员方法对象

<font color ="sky bule">反射获取Method【成员方法】对象
public class Demo1 {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {Class<?> clazz = Class.forName("com.itheima5.Student");//Method[] getMethods ():返回所有公共成员方法对象的数组,包括继承的/*Method[] methods = clazz.getMethods();for (Method method : methods) {System.out.println(method);}*///Method[] getDeclaredMethods ():返回所有成员防法对象的数组,不包括继承的Method[] declaredMethods = clazz.getDeclaredMethods();for (Method declaredMethod : declaredMethods) {System.out.println(declaredMethod);}//Method getMethod (string name,class<?>... parameterTypes) :返回单个公共成员方法对象//Method getDeclaredMethod (string name,Class<?>... parameterTypes):返回单个成员方法对象Method show = clazz.getDeclaredMethod("show", String.class, int.class);System.out.println(show);}
}打印结果:
-------------------------------------------------------------------------------------
public int com.itheima5.Student.sum(int,int)
public void com.itheima5.Student.show(java.lang.String)
private void com.itheima5.Student.show(java.lang.String,int)
private void com.itheima5.Student.show(java.lang.String,int)
4.1 Method对象的使用

method.invoke(student, 200, 100);

//反射获取成员方法使用
public class Demo2 {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {//获取类的字节码文件Class<?> clazz = Class.forName("com.itheima5.Student");//创建一个学生对象【调用方法使用】Student student = (Student) clazz.getConstructor().newInstance();//获取一个参数的show方法Method m1 = clazz.getMethod("show" , String.class);//System.out.println(m1);//执行m1.invoke(student,"hahah");//等价于obj.show (" hahah");//获取两个参数的show方法Method m2 = clazz.getDeclaredMethod("show", String.class, int.class);//System.out.println(m2);m2.setAccessible(true);//执行m2.invoke(student,"hehe",100);//等价于obj.show ("hehe",100);//获取两个int参数的sum方法[名称参数必须一致,不能少]Method m3 = clazz.getMethod("sum",int.class,int.class);//System.out.println(m3);//执行int sum = (int) m3.invoke(student, 200, 100);System.out.println(sum);}
}打印结果:
-------------------------------------------------------------------------------------
show...hahah
show...hehe...100
300
5. 思路总结

<1>获取Constructor对象
1.创建Class方法【Class.forName(“类的全路径名”)】—通用

2.调用Class获取Constructor对象方法
先看修饰符
如果需要访问私有,则用带Declared的方法
否则两种类型的方法都可以使用

3.访问单个构造:看参数类型和个数填写方法参数得到Constructor对象
访问多个构造:直接调用方法得到Constructor对象

4.得到Constructor对象后使用
Class.newInstance();只能反射无参的构造器,需要构造器非私有;
Constructor.newInstance();可以反射任何构造器,可以反射私有构造器【创建学生对象前加取消访问检查方法】

<2>Constructor.newInstance()得到的对象传递到 Field对象调用的set();get();参数中执行方法
<3>Constructor.newInstance()得到的对象传递到Method对象调用的invoke();参数中执行方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330802.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

thinking-in-java(11) 持有对象

【11.1】泛型和类型安全的容器 &#xff08;1&#xff09;ArrayList<Apple> 中尖括号括起来的是&#xff1a; 类型参数&#xff0c;它指定了这个容器实例可以保存的类型&#xff1b; 【荔枝&#xff1a;有泛型和没有泛型的区别】 class Apple {private static long coun…

JDK9新特性实战:简化流关闭新姿势

转载自 JDK9新特性实战&#xff1a;简化流关闭新姿势。做Java开发的都知道&#xff0c;每个资源的打开都需要对应的关闭操作&#xff0c;不然就会使资源一直占用而造成资源浪费&#xff0c;从而降低系统性能。 关于资源的关闭操作&#xff0c;从JDK7-JDK9有了不少的提升及简化。…

XML配置文件

XML的语法 1.xml是由自定义的标签组成 <开始标签>标签体</结束标签> <自闭合标签/> 2.xml文件的语法 1)必须要有一个文档声明 <?xml version"1.0" encoding"UTF-8" ?>2)只有一个根标签3)特殊字符 如< > & 必须使用…

DevExperience(1710)

【1】Date 和 String 互转 // Date 和 String 互转。public static void main(String[] args) {SimpleDateFormat formatter new SimpleDateFormat("yyyyMMdd");// Date 转 StringString curDateStr formatter.format(new Date());System.out.println("curDat…

Java Jar包的压缩、解压使用指南

转载自 Java Jar包的压缩、解压使用指南什么是jar包 JAR&#xff08;Java Archive&#xff09;是Java的归档文件&#xff0c;它是一种与平台无关的文件格式&#xff0c;它允许将许多文件组合成一个压缩文件。 如何打/解包 使用jdk/bin/jar.exe工具&#xff0c;配置完环境变量后…

枚举的实现

1.枚举的概念 枚举就是把几个固定的常量列举出来。枚举本质上也是一个类&#xff0c;只不过这个类的对象是几个固定的值&#xff0c;不能让外界创建对象【因为其内部的构造方法私有】 2.定义一个枚举类 public enum Week {//枚举项表示Week类的对象&#xff0c;带括号表示使…

think-in-java(17)容器深入研究

注意&#xff1a; 17章接着 11章继续分析 java容器&#xff0c; think-in-java(11) 【17.1】完整的容器分类方法 【容器分类网络解说】 1&#xff09;接口&#xff1a;虚线框&#xff0c;没有实线入边&#xff08;没有实体类继承关系&#xff0c;只有接口继承关系&#xff09…

浅析负载均衡的6种算法,Ngnix的5种算法

转载自 浅析负载均衡的6种算法&#xff0c;Ngnix的5种算法。 常见的几种负载均衡算法 1、轮询法 将请求按顺序轮流地分配到后端服务器上&#xff0c;它均衡地对待后端的每一台服务器&#xff0c;而不关心服务器实际的连接数和当前的系统负载。 2、随机法 通过系统的随机算法…

注解的实现

1.概念 注解表示一个标识(标注、标记)&#xff0c;它可以用在类上、方法上、变量上等&#xff0c;给类的各个组成部分一些额外的表示&#xff0c;能够被编译器识别。 2.常见注解 Override: 描述一个方法是复写的父类方法 Deprecate: 描述一个方法是过时的方法&#xff0c;调…

Java对象引用四个级别(强、软、弱、虚)

转载自 Java对象引用四个级别&#xff08;强、软、弱、虚&#xff09; 最近&#xff0c;高级Java技术栈微信群中&#xff0c;有一些猿友在讨论JVM中对象的周期问题&#xff0c;有谈到引用的级别&#xff0c;现在为大家做个总结吧&#xff0c;虽然大多数公司并没有意识或者用到这…

反射和配置文件的实际应用

1.利用反射完成不同参数赋值 <1>无参构造[默认赋值] Student 和 Teacher皆为JavaBean类 public class Demo1 {public static void main(String[] args) throws InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {//…

thinking-in-java(13) String字符串

【13.1】不可变String 1&#xff09;String对象是不可变的&#xff0c;具有只读特性&#xff1b; 【荔枝-String对象是不可变的】 public class Immutable {public static String upcase(String s) {return s.toUpperCase();}public static void main(String[] args) {Strin…

Java7任务并行执行神器:ForkJoin框架

转载自 Java7任务并行执行神器&#xff1a;Fork&Join框架Fork/Join是什么&#xff1f;Fork/Join框架是Java7提供的并行执行任务框架&#xff0c;思想是将大任务分解成小任务&#xff0c;然后小任务又可以继续分解&#xff0c;然后每个小任务分别计算出结果再合并起来&#…

单元测试和日志技术

1.Junit使用的基本流程 <1>将junit的jar包导入到工程中 <2>编写测试方法该测试方法必须是公共的无参数无返回值的非静态方法在测试方法上使用Test注解标注该方法是一个测试方法 <3>选中测试方法右键通过junit运行该方法 Junit点击下载 2.Junit常用的三个注…

DB2书籍推荐!

链接&#xff1a; http://blog.csdn.net/db2cn/article/details/4336619第一本《循序渐进DB2——DBA系统管理、运维与应用案例》&#xff1a;内容简介DB2数据库是IBM 公司关系型数据库核心产品&#xff0c;在国内以及全球有着广泛的应用。针对DB2初学者&#xff0c;本书循序渐进…

@Controller,@Service,@Repository,@Component详解

转载自 Controller,Service,Repository,Component详解 Controller 用来表示一个web控制层bean&#xff0c;如SpringMvc中的控制器。 Service 用来表示一个业务层bean。 Repository 用来表示一个持久层bean&#xff0c;即数据访问层DAO组件。 Component 用来表示一个平常的普通组…

thinking-in-java(12)通过异常处理错误

【12.0】开场白1&#xff09;java的基本理念&#xff1a;结构不佳的代码不能运行&#xff1b;2&#xff09;改进的错误恢复机制&#xff1a;是提供代码健壮性的最强有力的方式&#xff1b;3&#xff09;java异常&#xff1a;3.1&#xff09;java采用异常来提供一致的错误报告模…

分布式系统架构常识:CAP理论

转载自 分布式系统架构常识&#xff1a;CAP理论什么是CAP理论&#xff1f; 2000年7月&#xff0c;加州大学伯克利分校的Eric Brewer教授在ACM PODC会议上提出CAP猜想。2年后麻省理工学院的Seth Gilbert和NancyLynch从理论上证明了CAP&#xff0c;之后CAP理论正式成为分布式计算…

GIt代码管理仓库

1.Git的概念 a.Git是一个代码版本控制工具&#xff0c;有下面几个特点 <1>Git可以用于备份项目代码 <2>Git可以管理代码的各个版本 <3>Git可以方便大家协同工作 <4>Git可以方便代码追责 b.Git和SVN对比 SVN是集中式的版本控制系统&#xff0c;而Git是…