java 反射机制详解及实例代码
作者:lqh 发布时间:2023-01-31 10:26:08
标签:java,反射机制
java 反射机制:
测试实体类
以Human为例
/**
* Project: Day12_for_lxy
* Created: Lulu
* Date: 2016/8/10
*/
public class Human<T> {
private String name;
private int age;
private float height;
private static int legs = 2;
private Map<String, String> jobs;
private T t;
public int say() {
System.out.println("I'm" + name);
return 0;
}
private void sleep(Human human) {
System.out.println(name + " sleep with " + human.name);
}
public List<Integer> getList() {
return new ArrayList<>();
}
public Human() {
}
private Human(String name, int age, float height) {
this.name = name;
this.age = age;
this.height = height;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age > 150 || age < 0) {
throw new RuntimeException("age > 150 || age < 0");
}
this.age = age;
}
public float getHeight() {
return height;
}
public void setHeight(float height) {
this.height = height;
}
@Override
public String toString() {
return "Human{" +
"name='" + name + '\'' +
", age=" + age +
", height=" + height +
'}';
}
}
测试获取构造方法
/**
* Project: Day12_for_lxy
* Created: Lulu
* Date: 2016/8/10
*/
/*
获取构造方法
*/
public class TestConstructor {
public static void main(String[] args) {
//得到相应的类结构, 这是用来描述Human这个类的类
Class<Human> humanClass = Human.class;
try {
//// 这是在知道构造方法结构的前提下
// //获取都明确参数的构造方法, 获取的是公开的(public)
// Constructor<Human> constructor1 = humanClass.getConstructor(String.class, Integer.TYPE, Float.TYPE);
//
// Human h1 = constructor1.newInstance("小明", 18, 1.85f);
// System.out.println(h1.toString());
//
// //构造方法, 修饰符类型
// int modifiers = constructor1.getModifiers();
// if (Modifier.isPublic(modifiers)) {
// System.out.println("是public");
// }
// ////获取都明确参数的构造方法, 获取的是声明的
// Constructor<Human> constructor2 = humanClass.getDeclaredConstructor(String.class, Integer.TYPE, Float.TYPE);
// //设置可以全部访问
// constructor2.setAccessible(true);
// //这样是可以获取到所有的构造方法, 包括私有的
// Human human2 = constructor2.newInstance("zll", 18, 1.80f);
// System.out.println(human2.toString());
//不知道构造方法的类结构
Constructor<?>[] constructors = humanClass.getDeclaredConstructors();
for (Constructor<?> c : constructors) {
c.setAccessible(true);
System.out.println(c.getName());
System.out.println("===========================");
//参数列表
Class<?>[] types = c.getParameterTypes();
for (Class<?> type : types) {
System.out.println(type.getTypeName());
}
//修饰符类型
int modifiers = c.getModifiers();
if (Modifier.isPublic(modifiers)) {
System.out.println("是公开的");
}else if (Modifier.isPrivate(modifiers)){
System.out.println("是私有的");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
测试获取字段
/**
* Project: Day12_for_lxy
* Created: Lulu
* Date: 2016/8/10
*/
/*
获取属性:
属性包括:( 属性名 类型 修饰符 泛型 )
父类的属性
自身的属性
*/
public class TestField {
public static void main(String[] args) {
Class<Human> humanClass = Human.class;
Field[] fields = humanClass.getDeclaredFields();
for (Field f : fields) {
//属性名
System.out.print(" 名字: " + f.getName() + " ");
System.out.println();
//类型
System.out.print("类型 :" + f.getType() + " ");
System.out.println();
//修饰符
int modifiers = f.getModifiers();
if (Modifier.isPublic(modifiers)) {
System.out.println("公开的");
} else if (Modifier.isPrivate(modifiers)) {
System.out.println("私有的");
}
}
System.out.println("============================泛型==================================");
try {
//通过类结构获取jobs属性
Field jobs = humanClass.getDeclaredField("jobs");
//泛型
ParameterizedType type = (ParameterizedType) jobs.getAnnotatedType().getType();
Type[] types = type.getActualTypeArguments();
for (Type type1 : types) {
System.out.println(type1);
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("===================设置值, 得到值============================");
try {
Human<Object> human = new Human<>();
//非静态, 你要知道给谁设置属性的值
Field nameField = humanClass.getDeclaredField("name");
nameField.setAccessible(true);
nameField.set(human, "路新艺");
System.out.println(human.getName());
//静态
Field legs = humanClass.getDeclaredField("legs");
int modifiers = legs.getModifiers();
legs.setAccessible(true);
if (Modifier.isStatic(modifiers)) {
System.out.println("是静态的");
}
legs.set(null, 4);
System.out.println(legs.get(null));
} catch (Exception e) {
e.printStackTrace();
}
}
}
测试获取方法
/**
* Project: Day12_for_lxy
* Created: Lulu
* Date: 2016/8/10
*/
/*
获取方法:
方法名
修饰符
返回值类型
泛型
静态和非静态
方法的调用
*/
public class TestMethod {
public static void main(String[] args) {
Class<Human> humanClass = Human.class;
//方法名
Method[] ms = humanClass.getDeclaredMethods();
for (Method m : ms) {
m.setAccessible(true);
System.out.print("方法名: " + m.getName() + " " );
int modifiers = m.getModifiers();
if (Modifier.isPublic(modifiers)) {
System.out.println("公开的");
} else if (Modifier.isPrivate(modifiers)) {
System.out.println("私有的");
}
}
//在确定方法参数的情况下 方法名不能唯一的确定, 重载
try {
//普通类型
Method sayM = humanClass.getDeclaredMethod("say");
Class<?> returnType = sayM.getReturnType();
System.out.println(returnType.toString());
//泛型
Method getListM = humanClass.getDeclaredMethod("getList");
System.out.println(getListM.getReturnType());
ParameterizedType type = (ParameterizedType) getListM.getAnnotatedReturnType().getType();
System.out.println(type);
Type[] ts = type.getActualTypeArguments();
for (Type t : ts) {
System.out.println(t);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
测试获取类信息
public static void main(String[] args) {
printClassInfo(Student.class);
}
public static void printClassInfo(Class c){
//Java中唯一的父类的类时Object
System.out.println(c.getName());
System.out.println(c.getSimpleName());
System.out.println(c.getSuperclass());
Class[] interfaces = c.getInterfaces();
for (Class anInterface : interfaces) {
System.out.println(anInterface);
}
//外部类类只有两种访问权限修饰(public 和 default)
int modifiers = c.getModifiers();
}
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
0
投稿
猜你喜欢
- 1.idea新建Maven项目Mybatis-study 将项目里的src文件夹删掉 依次将此项目作为父项目2.在Mybatis-study
- MyBatis动态sql动态sql处理简单的多参数查询常用标签标签说明if条件判断,与java中的if语句类似where为sql语句动态添加
- 在redirect重定向的时候携带参数问题SpringMVC 中常用到 redirect来实现重定向。但使用场景各有需求,如果只是简单的页面
- 目录前言常量池反编译代码验证字符串初始化操作总结前言在深入学习字符串类之前,我们先搞懂JVM是怎样处理新生字符串的。当你知道字符串的初始化细
- APT(Annotation Processing Tool 的简称),可以在代码编译期解析注解,并且生成新的 Java 文件,减少手动的代
- class文件中的访问标志信息位于常量池下面的2个字节是access_flags 。 access_flags 描述的是当前类(或
- Flutter有个悠久的传统,便是运行flutter create并删除所有内容,然后在所有标准样板文件(boilerplate)当中尽力复
- 1. reference:参考某一资源ID。(1)属性定义:<declare-styleable name = "名称&qu
- 本文实例讲述了Android编程之短信 * 实现方法。分享给大家供大家参考,具体如下:服务器:1、修改frombean:VideoForm中
- 本文实例讲述了Java * 和AOP应用。分享给大家供大家参考,具体如下:一 点睛 * 在AOP(Aspect Orient Progr
- 本文实例为大家分享了java仿windows记事本小程序的具体代码,供大家参考,具体内容如下import java.awt.Checkbox
- final关键字可用于变量声明,一旦该变量被设定,就不可以再改变该变量的值。 通常final定义的变量为常量。如:final double
- WebService是一个SOA(面向服务的编程)的架构,它是不依赖于语言,不依赖于平台,可以实现不同的语言间的相互调用,通过Interne
- Handler每个初学Android开发的都绕不开Handler这个“坎”,为什么说是个坎呢,首先这是Android架构的精髓之一,其次大部
- 好了下面进入正题,我们先看一下实现效果吧:下面来介绍一下代码: 本思路就是:1.先到手机中扫描jpeg和png的图片2.获取导图片
- jstat命令简介jstat(Java Virtual Machine Statistics Monitoring Tool)是JDK提供的
- 题外由于idea原因 用注解test无法在控制台上输入所以写死到程序里了,版本都30.9102了为什么还是这样啊,intelJ你们该反思了!
- 问题:系统要求导入40万条excel数据,采用poi方式,服务器出现内存溢出情况。解决方法:由于HSSFWorkbook workbook
- 经过几天的折腾,终于到了学习一个重量级的查询方式上,使用@Query注解,使用注解有两种方式,一种是JPQL的SQL语言方式,一种是原生SQ
- 通常C#使用基于XML的配置文件,不过如果有需要的话,比如要兼顾较老的系统,可能还是要用到INI文件。但C#本身并不具备读写INI文件的AP