首页 > 编程知识 正文

java的反射机制是怎么实现的,java反射怎么理解

时间:2023-05-04 06:08:46 阅读:41060 作者:4295

Java的反射1,什么是反射

反射java语言的工作原理,对象、读/写属性和调用方法2,反射:java.lang.Class 类类

反射中的三个相关包

类属性java.lang.reflect.Field类方法java.lang.reflect.Method构造函数java.lang.reflect.construct获取Student.java爸爸

代码如下。

package com.su.impl; 公共类student {隐私保护sid; 私有字符串名称; 公共集成器Age; static { system.out.println ('加载到JVM中!' ); }public Student () {super ); System.out.println; }公共student (strings id ) {super ); this.sid=sid; System.out.println; }公共student (strings id,String sname ) {super ); this.sid=sid; this.sname=sname; system.out.println ('调用具有两个参数的构造方法创建了学生对象'); }@suppresswarnings(unused ) ) privatestudent (integer age ) {System.out.println )调用student类的私有构造方法this.age=age; }公共字符串getsid () {return sid; }公共语音设置(strings id ) {this.sid=sid; }公共字符串gets name (() {return sname; } publicvoidsetsname (strings name ) {this.sname=sname; }public void hello () {System.out.println ('你好! 我是' this.sname; }公共语音助手(字符串名称)系统. out.println )你好! 我是' this.sname; }@suppresswarnings(unused ) ) privateInteger bdd ) integera,Integer b ) return new integer (b.intvalue ) b.intValue

Class.forName (“完整路径名”) jdbc/自定义mvc框架

代码如下。 package com.su.impl; public class demo1{ publicstaticvoidmain (字符串[ ] args ) throwsclassnotfoundexception (/1,Class.forName ) (完整路径名) ) }运行结果:

类名. class用作通用的页面查询方法

代码如下。 package com.su.impl; public class demo1{ publicstaticvoidmain (字符串[ ] args ) throwsclassnotfoundexception (/2,类名. class )通用分页查询}运行结果:

类实例的类实例的getClass ) )获取通用的添加/删除检查并将其通用

代码如下。 package com.su.impl; public class demo1{ publicstaticvoidmain (字符串[ ] args ) throwsclassnotfoundexception (/3,类实例的类实例的getClass system.out.println(Stuclz2; }运行结果:3,获取类对象的三种方式

使用反射实例化对象

好处:

1,可以实例化未知对象

2,可以在私有构造函数中实例化对象

代码如下。

package com.su.impl; import ja

va.lang.reflect.Constructor;/** * 利用反射进行对象的实例化 * 优势: * 1,能够对未知的对象进行实例化 * 2,能够对私有构造器实例化对象 * 之前:通用new关键字进行实例化 * 现在: * 通过Java.lang.reflect.construct来实例化对象 * * */public class Demo2 {public static void main(String[] args) throws Exception, Exception {Class<Student> StuClz=Student.class;//newInstance这个方法默认是使用无参构造器去实例化对象Student stu2= (Student)StuClz.newInstance();System.out.println(stu2);}}

运行结果:

调用有参构造器去进行实例化对象 package com.su.impl;import java.lang.reflect.Constructor;public class Demo2 {public static void main(String[] args) throws Exception, Exception {//调用有参构造器去进行实例化对象Constructor<Student> constructor = StuClz.getConstructor(String.class,String.class);Student stu2 = (Student) constructor.newInstance("s001","zs");}}

调用私有构造器去实例化对象 package com.su.impl;import java.lang.reflect.Constructor;public class Demo2 {public static void main(String[] args) throws Exception, Exception {//调用私有构造器去实例化对象Constructor<Student> constructor = StuClz.getDeclaredConstructor(Integer.class);constructor.setAccessible(true);Student stu2 = (Student) constructor.newInstance(18);}}


5,反射动态调用方法

无参的 package com.su.impl;import java.lang.reflect.Method;/** * 动态方法调用 * * **/public class Demo3 {public static void main(String[] args) throws Exception, Exception {Student stu = new Student();Class<? extends Student> stuClz=stu.getClass();//无参的Method m= stuClz.getDeclaredMethod("hello");m.invoke(stu);}}

有参的 package com.su.impl;import java.lang.reflect.Method;/** * 动态方法调用 * * **/public class Demo3 {public static void main(String[] args) throws Exception, Exception {Student stu = new Student();Class<? extends Student> stuClz=stu.getClass();//有参的Method m=stuClz.getDeclaredMethod("hello", String.class);m.invoke(stu, "zs");}}

私有的 package com.su.impl;import java.lang.reflect.Method;/** * 动态方法调用 * * **/public class Demo3 {public static void main(String[] args) throws Exception, Exception {Student stu = new Student();Class<? extends Student> stuClz=stu.getClass();//私有的Method m=stuClz.getDeclaredMethod("add", Integer.class,Integer.class);m.setAccessible(true);Object invoke= m.invoke(stu, 20,5);System.out.println(invoke);}}


6,反射读写属性

获取私有值 package com.su.impl;import java.lang.reflect.Field;/** * 反射读写属性 * 自定义标签库 通用分页 自定义MVC * * **/public class Demo4 {public static void main(String[] args) throws Exception, Exception {Student stu=new Student("s001","zs");stu.age=22;System.out.println(stu.getSid());System.out.println(stu.getSname());Class<? extends Student> stuClz=stu.getClass();//获取私有值Field f=stuClz.getDeclaredField("age");f.setAccessible(true);System.out.println(f.get(stu));}}

获取当前student实例中的stu所有属性及其属性值 package com.su.impl;import java.lang.reflect.Field;/** * 反射读写属性 * 自定义标签库 通用分页 自定义MVC * * **/public class Demo4 {public static void main(String[] args) throws Exception, Exception {Student stu=new Student("s001","zs");stu.age=22;System.out.println(stu.getSid());System.out.println(stu.getSname());Class<? extends Student> stuClz=stu.getClass();//获取当前student实例中的stu所有属性及其属性值Field[] fields=stuClz.getDeclaredFields();for (Field field : fields) {field.setAccessible(true);System.out.println(field.getName()+":"+field.get(stu));}}}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。