博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
简单理解java反射机制
阅读量:6914 次
发布时间:2019-06-27

本文共 3126 字,大约阅读时间需要 10 分钟。

什么是反射?

1,反编译:.class-->.java

2.通过反射机制访问java对象的属性,方法,构造方法等;

反射应用场景:

Jdbc 加载驱动-----

Spring ioc

框架

获取类的三种方法

//第一种方式: 

        Classc1 = Class.forName("Employee"); 

//第二种方式: 

        //java中每个类型都有class 属性. 

        Classc2 = Employee.class; 

 //第三种方式: 

        //java语言中任何一个java对象都有getClass 方法 

        Employee e = new Employee(); 

        Classc3 = e.getClass(); //c3是运行时类 (e的运行时类是Employee) 

代码实现

创建User类

public class User {    private Integer id;    private String password;    public User(){        System.out.println("无参构造");    }    public User(Integer id, String password) {        this.id = id;        this.password = password;        System.out.println("有参构造");    }   public String show(String s){
    return s;   }    public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User{" + "id=" + id + ", password='" + password + '\'' + '}'; }}

 

 

1.创建无参构造函数

public class Demo1 {    //通过反射创建无参构造函数    public static void main(String[] args) throws Exception {        //通过反射机制获取类        Class
clazz = Class.forName("org.lzh.xxx.User"); //通过反射机制创建User对象 User user = (User) clazz.getDeclaredConstructor().newInstance(); user.setId(20); System.out.println(user.getId()); }}输出:无参构造20

 

2.创建有参构造函数

public class Demo2 {    //通过反射创建有参构造函数    public static void main(String[] args) throws Exception {        Class
clazz = Class.forName("org.lzh.xxx.User"); //参数为成员类型.class Constructor
constructor = clazz.getConstructor(Integer.class, String.class); //赋值并强转 User user = (User) constructor.newInstance(20, "abc"); System.out.println(user); }}输出:有参构造User{id=20, password='abc'}

 

3.通过反射给私有成员变量赋值

public class Demo3 {    //通过反射给私有成员变量赋值    public static void main(String[] args) throws Exception {        Class
clazz = Class.forName("org.lzh.xxx.User"); //创建无参构造函数,强转成User类,得到User对象 Object o = clazz.getDeclaredConstructor().newInstance(); User user = (User) o; //参数与User中成员变量相同 Field id = clazz.getDeclaredField("id"); Field password = clazz.getDeclaredField("password"); //通过反射操作私有属性,因为属性是私有的,所以必须添加方法被允许访问 id.setAccessible(true); //通过set方法给User对象的id赋值为20,下面同理 id.set(user, 20); password.setAccessible(true); password.set(user, "abc"); System.out.println(user); }}输出:无参构造 User{id=20, password='abc'}

 4.通过反射获取带参带返回值成员方法并使用

public class Demo4 {    public static void main(String[] args) throws Exception{        Class
clazz = Class.forName("org.lzh.xxx.User"); Object o = clazz.getDeclaredConstructor().newInstance(); //第一个参数是方法的名字,第二个参数是成员类型.class Method method = clazz.getMethod("show",String.class); //有返回值,object可以接收所有类型 Object invoke = method.invoke(o, "abc"); System.out.println(invoke); }}输出:无参构造abc

 

转载于:https://www.cnblogs.com/lzh110/p/9459916.html

你可能感兴趣的文章
csu 1984: LXX的能力值
查看>>
汉编随想(一)
查看>>
开源的Android开发框架-------PowerFramework使用心得(五)网络请求HTTPRequest
查看>>
[转载]kmeans
查看>>
一个不错的架构图:基于SpringCloud的微服务项目
查看>>
成为顶尖自由职业者必备的7个软技能之一:沟通(转)
查看>>
获取合并单元格中值的一个方法POI
查看>>
ORACLE Install (10g r2) FOR Red Hat Enterprise Linux Server release 5.5 (64 bit) (转)
查看>>
入手Invicta 8926 OB潜水自动机械腕表
查看>>
Android UI适配总结(一)寻找最佳匹配资源
查看>>
我是小白之<%%>用法
查看>>
F# 入门(十一):链表与数组
查看>>
树套树
查看>>
[IOS笔记] - 关于线程[3]
查看>>
java socket通信-传输文件图片--传输图片
查看>>
Windows 10 远程连接出现函数错误 【这可能由于CredSSP加密Oracle修正】
查看>>
MySQL read_only选项的作用
查看>>
职业方向
查看>>
3DMAX 卸载工具,完美彻底卸载清除干净3dmax各种残留注册表和文件
查看>>
生日蜡烛
查看>>