博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
反射基础(一)
阅读量:4281 次
发布时间:2019-05-27

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

创建User类:
package com.shu.compressphoto.reflect;
/**
 * Created by Administrator on 2017/3/14.
 */
public class User {
    private String uname;
    private String age;
    private String id;
    public String address;
    public User() {
    }
    public User(String uname, String age, String id) {
        this.uname = uname;
        this.age = age;
        this.id = id;
    }
    public String getUname() {
        return uname;
    }
    public void setUname(String uname) {
        this.uname = uname;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
}
1.创建class的三种方法:
String path = "com.shu.compressphoto.reflect.User";
try {
    Class u1 = Class.forName(path);//方法一:创建Class
    System.out.println(u1);
    Class<User> u2 = User.class;//方法二:创建Class
    System.out.println(u2);
    User u3 = new User();//方法三:创建Class
    System.out.println(u3.getClass());
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}
结果:
class com.shu.compressphoto.reflect.User
class com.shu.compressphoto.reflect.User
class com.shu.compressphoto.reflect.User
三种方法无论怎么创建只有是一种类型的对象,获取到的class都是一样的。
User user1 = new User();
User user2 = new User("张三","23","0001");
System.out.println("对象创建:"+user1.getClass());
System.out.println("对象创建:"+user2.getClass());
结果:
对象创建:class com.shu.compressphoto.reflect.User
对象创建:class com.shu.compressphoto.reflect.User
无论构造方法是怎样的,同一种类型创建的的class只有一种。
2.获取Class的构造方法,属性值,方法
Class clazz1 = Class.forName(path);//方法一:创建Class
System.out.println(clazz1);
Field uname = clazz1.getField("uname");
Field[] fields = clazz1.getFields();
Field uname1 = clazz1.getDeclaredField("uname");
Field[] declaredFields = clazz1.getDeclaredFields();
获取的所有的属性只是public权限的属性:
public 
Field getField(String name)根据属性名获取属性
public Field[] getFields()   获取所有public属性
获取的所有的属性所有权限的属性:
public native Field getDeclaredField(String name)
根据属性名获取属性
public native Field[] getDeclaredFields();
获取所有public属性
结果:
uname1=private java.lang.String com.shu.compressphoto.reflect.User.uname
同理获取构造方法和方法:
获取的所有的属性只是public权限的属性:
public Method getMethod(String name, Class<?>... parameterTypes)
public Method[] getMethods()
获取的所有的属性所有权限的属性:
public Method getDeclaredMethod(String name, Class<?>... parameterTypes)
public Method[] getDeclaredMethods();
Method getUname = clazz1.getDeclaredMethod("getUname", null);
Method setUname = clazz1.getDeclaredMethod("setUname", String.class);
System.out.println("getUname="+getUname);
System.out.println("setUname="+setUname);
结果:
getUname=public java.lang.String com.shu.compressphoto.reflect.User.getUname()
setUname=public void com.shu.compressphoto.reflect.User.setUname(java.lang.String)
 
获取的所有的属性只是public权限的属性:
public Constructor<T> getConstructor(Class<?>... parameterTypes)
public Constructor<?>[] getConstructors()
获取的所有的属性所有权限的属性:
public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
public Constructor<?>[] getDeclaredConstructors()

转载地址:http://abfgi.baihongyu.com/

你可能感兴趣的文章
2017年成为全栈开发工程师的权威指南
查看>>
深度学习入门和学习书籍
查看>>
JVM安全退出(如何优雅的关闭java服务)
查看>>
一文读懂特征工程
查看>>
Spring Boot + Mybatis + Redis二级缓存
查看>>
为什么要前后端分离?各有什么优缺点?
查看>>
为什么要用Redis
查看>>
Redis 的基础数据类型和应用场景
查看>>
JVM难学?那是因为你没认真看完这篇文章
查看>>
领域模型驱动设计(Domain Driven Design)入门概述
查看>>
微前端的设计理念与实践初探
查看>>
编程语言选型时,你需要考虑的几个方面
查看>>
jvm 性能调优工具之 jstat
查看>>
Java 中一些好的编码风格
查看>>
你准备好持续交付(CD)了吗?
查看>>
API 经济与实现之路
查看>>
新手入门:零基础理解大型分布式架构的演进历史、技术原理、最佳实践
查看>>
对业务系统的监控
查看>>
异常和数据库事务的几个容易出错的地方
查看>>
eclipse、myEclipse中svn的各种状态图标详解
查看>>