反射机制
来源:互联网 发布:mesh网络 路由器 编辑:程序博客网 时间:2024/05/18 03:53
反射概述
01.反射:就是通过class文件对象,去使用该文件中的成员变量,构造方法,成员方法。 获取class文件对象的三种方式 1.Object类中的getClass方法 2.数据类型的静态属性class 3.Class类中的静态方法 public static Class forName(String className)
public class ReflectDemo { public static void main(String[] args) throws ClassNotFoundException { // 方式1 Person p = new Person(); Class c = p.getClass(); Person p2 = new Person(); Class c2 = p2.getClass(); System.out.println(p == p2);// false System.out.println(c == c2);// true // 方式2 Class c3 = Person.class; // int.class; // String.class; System.out.println(c == c3); // 方式3 // ClassNotFoundException Class c4 = Class.forName("cn.itcast_01.Person"); System.out.println(c == c4); }}
02.Class类:对应方法变量使用的类 成员变量 Field 构造方法 Constructor 成员方法 Method
反射的用法
01.通过反射获取构造方法并使用获取构造方法 public Constructor[] getConstructors():所有公共构造方法 public Constructor[] getDeclaredConstructors():所有构造方法 public Constructor<T> getConstructor(Class<?>... parameterTypes)获取单个构造方法(参数表示的是你要获取的构造函数的参数类型的class对象,有几个填几个)
package com.reflect.demo;public class Student { public String name; private int age; int score; public Student() { } Student(String name, int age) { this.name = name; this.age = age; } private Student(String name,int age,int score) { this.name=name; this.age=age; this.score=score; } public void show() { System.out.println("show"); } @Override public String toString() { return "Student [name=" + name + ", age=" + age + ", score=" + score + "]"; } private void method(String s ) { System.out.println("这是个私有方法"+s); }}
public class demo1 { public static void main(String[] args) throws Exception { //获取字节码文件对象 Class c = Class.forName("com.reflect.demo.Student"); //返回的是构造方法的对象 Constructor con = c.getDeclaredConstructor(); //Object obj = con.newInstance() //使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例 Object obj = con.newInstance(); System.out.println(obj); }}
通过反射获取带参的构造方法案例
public class demo1 { public static void main(String[] args) throws Exception { //获取字节码文件对象 Class c = Class.forName("com.reflect.demo.Student"); //返回的是构造方法的对象 Constructor con = c.getDeclaredConstructor(String.class,int.class); //Object obj = con.newInstance() //使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例 Object obj = con.newInstance("fah",23); System.out.println(obj); }}
通过反射获取私有带参构造案例
public class demo1 { public static void main(String[] args) throws Exception { //获取字节码文件对象 Class c = Class.forName("com.reflect.demo.Student"); //返回的是构造方法的对象 Constructor con = c.getDeclaredConstructor(String.class,int.class,int.class); // 暴力访问,值为true则指示反射的对象在使用时应该取消Java语言访问检查 con.setAccessible(true); //Object obj = con.newInstance() //使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例 Object obj = con.newInstance("fah",23,98); System.out.println(obj); }}
02.通过反射获取成员变量并使用 获取成员变量 public Field[] get Fields():所有公共变量 public Fieldr[] getDeclaredFieldrs():所有变量
public class demo1 { public static void main(String[] args) throws Exception { //获取字节码文件对象 Class c = Class.forName("com.reflect.demo.Student"); //返回的是构造方法的对象 Constructor con = c.getDeclaredConstructor(String.class,int.class,int.class); // 暴力访问,值为true则指示反射的对象在使用时应该取消Java语言访问检查 con.setAccessible(true); //Object obj = con.newInstance() //使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例 Object obj = con.newInstance("fah",23,98); //获取单个变量并赋值 Field fd=c.getField("name"); //public void set(Object obj,Object value) // 将指定对象变量上此 Field 对象表示的字段设置为指定的新值 fd.set(obj, "zsl"); // 给obj对象的addressField字段设置值为"zsl" //获取私有变量并赋值 Field fd2=c.getDeclaredField("age"); fd2.setAccessible(true);// fd2.set(obj, 22); System.out.println(obj); }}
03. public Method[] get Methods():所有公共成员方法 public Method[] getDeclaredMethods():所有成员方法
public class demo1 { public static void main(String[] args) throws Exception { // 获取字节码文件对象 Class c = Class.forName("com.reflect.demo.Student"); // 返回的是构造方法的对象 Constructor con = c.getDeclaredConstructor(); Object obj = con.newInstance(); // public Object invoke(Object obj,Object... args) // 返回值是Object接收,第一个参数表示对象是谁,第二参数表示调用该方法的实际参数 Method m1 = c.getDeclaredMethod("show"); // public Object invoke(Object obj,Object... args) // 返回值是Object接收,第一个参数表示对象是谁,第二参数表示调用该方法的实际参数 m1.invoke(obj); // 调用obj对象的m1方法 System.out.println("-----------"); Method m2=c.getDeclaredMethod("method", String.class); m2.setAccessible(true); m2.invoke(obj, "hello"); }}
阅读全文
0 0
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 用串口修改ARM的IP地址
- Ajax请求无法下载文件的原因
- 调用手机摄像头
- 在Kotlin中保持常数
- python基础学习-socket网络编程
- 反射机制
- C# 并行集合类总结
- 循环实现x的y次方
- QNX常用调试命令-QNX常用命令
- linux查找目录下的所有文件中是否含有某个字符串
- opencv关于矩阵的操作
- 解决中文输入 Qt 针对5.8也做了说明 及4.x版本
- numpy模块的linspace函数实例
- 邮件中嵌入html中要注意的样式