Java反射获取类和对象信息全解析
来源:互联网 发布:mac接外置光驱不能读取 编辑:程序博客网 时间:2024/05/30 19:32
获取类对象
Class.forName(String clazzName)静态方法
调用类的class属性,Person.class返回的就是Person的class对象(推荐使用)
调用某个对象的getClass()方法
获取类的信息
获取类构造器
Connstructor<T> getConstructor(Class<?>...parameterTypes)
:返回此Class对象对应类的带指定形参的public构造器Constructor<?>[] getConstructors()
:返回此Class对象对应类的所有public构造器Constructor<T>[] getDeclaredConstructor(Class<?>...parameterTypes)
:返回此class对象对应类的带指定参数的构造器,与构造器的访问权限无关Constructor<?>[] getDeclaredConstructors()
:返回此class对象对应类的所有构造器,与构造器的访问权限无关
获取类成员方法
Method getMethod(String name,Class<?>...parameterTypes)
:返回此class对象对应类的带指定形参的public方法Method[] getMethods()
:返回此class对象所表示的类的所有public方法Method getDeclaredMethod(string name,Class<?>...parameterTypes)
:返回此class对象对应类的带指定形参的方法,与方法访问权限无关Method[] getDeclaredMethods()
:返回此class对象对应类的全部方法,与方法的访问权限无关
获取类成员变量
Field getField(String name)
:返回此class对象对应类的指定名称的public成员变量Field[] getFields()
:返回此class对象对应类的所有public成员变量Field getDeclaredField(String name)
:返回此class对象对应类的指定名称的成员变量,与成员变量访问权限无关Field[] getDeclaredFields()
:返回此class对象对应类的全部成员变量,与成员变量的访问权限无关
获取类注解
<A extends Annotation>A getAnnotation(Class<A>annotationClass)
:尝试获取该class对象对应类上村子的指定类型的Annotation,如果该类型注解不存在,则返回null<A extends Annotation>A getDeclaredAnnotation(Class<A>annotationClass)
:这是Java 8中新增的,该方法获取直接修饰该class对象对应类的指定类型的Annotation,如果不存在,则返回nullAnnotation[] getAnnotations()
:返回修饰该class对象对应类上存在的所有AnnotationAnnotation[] getDeclaredAnnotations()
:返回修饰该Class对象对应类上存在的所有Annotation<A extends Annotation>A[] getAnnotationByType(Class<A>annotationClass)
:该方法的功能与前面介绍的getAnnotation()方法基本相似,但由于Java8增加了重复注解功能,因此需要使用该方法获取修饰该类的指定类型的多个Annotation<A extends Annotation>A[] getDeclaredAnnotationByType(Class<A>annotationClass)
:该方法发功能与前面介绍的getDeclaredAnnotations()方法相似,也是因为Java8的重复注解的功能,需要使用该方法获取直接修饰该类的指定类型的多个Annotation
获取该类内部类
Class<?>[] getDeclaredClasses()
:返回该class队形对应类里包含的全部内部类
获取该类对象所在的外部类
Class<?> getDeclaringClass()
:返回该Class对象对应类所在的外部类
获取该类对象对应类所实现的接口
Class<?>[] getInterfaces()
:返回该Class对象对应类所实现的全部接口
获取该类对象对应类所继承的父类
Class<? super T> getSuperclass()
:返回该Class对象对应类的超类的Class对象
获取该类对象对应类的修饰符、所在包、类名等基本信息
int getModifiers()
:返回此类或接口的所有修饰符,修饰符由public、protected、private、final、static、abstract等对应的常量组成,返回的整数应使用Modifier工具类的方法来解码,才可以获取真是的修饰符Package getPackage()
:获取该类的包String getName()
:以字符串形式返回此CLass对象所表示的类的简称
判断该类是否为接口、枚举、注解类型
boolean isAnnotation()
:返回此class对象是否表示一个注解类型boolean isAnnotationPresent(Class<? extends Annotation>annotationClass)
:判断此Class对象是否使用类Annotation修饰boolean isAnonymousClass()
:返回此class对象是否是一个匿名类boolean isArray()
:返回此class对象是否表示一个数组类boolean isEnum()
:返回此class对象是否表示一个枚举boolean isInterface()
:返回此class对象是否表示一个接口boolean isInstance(Object obj)
:判断obj是否是此class对象的实例,该方法可以完全代替instanceof操作符
public
interface
Colorable {
public
void
value();
}
public
class
ClassInfo {
public
static
void
main(String[] args)
throws
NoSuchMethodException, SecurityException { Class<Colorable> cls=Colorable.
class
; System.out.println(cls.getMethod(
"value"
)); System.out.println(cls.isAnnotation()); System.out.println(cls.isInterface());
}
}
public
abstract
void
com.em.Colorable.value()falsetrue
Java8中新增的方法参数反射
int getParameterCount()
:获取该构造器或方法的形参个数Parameter[] getParameters()
:获取该构造器或方法的所有形参getModifiers()
:获取修饰该形参的修饰符String getName()
:获取形参名Type getParameterizedType()
:获取带泛型的形参类型Class<?>getType()
:获取形参类型boolean isNamePresent()
:该方法返回该类的class文件中是否包含了方法的形参名信息boolean isVarArgs()
:该方法用于判断该参数是否为个数可变的形参
public
class
Test {
public
void
getInfo(String str,List<String>list){
System.out.println(
"成功"
);
}
}
public
class
ClassInfo {
public
static
void
main(String[] args)
throws
NoSuchMethodException, SecurityException {
Class<Test> cls=Test.
class
;
Method med=cls.getMethod(
"getInfo"
, String.
class
,List.
class
);
System.out.println(med.getParameterCount());
Parameter[] params=med.getParameters();
System.out.println(params.length);
for
(Parameter par:params){
System.out.println(par.getName());
System.out.println(par.getType());
System.out.println(par.getParameterizedType());
}
}
}
2
2arg0class java.lang.Stringclass java.lang.Stringarg1interface java.util.Listjava.util.List<java.lang.String>
反射生成对象
使用Class对象的newInstance()方法创建Class对象的实例,该方法要求要有默认构造器(比较常用)
先使用Class对象获取指定的Constructor对象,在调用Constructor对象的newInstance()方法来创建该Class对象对应类的实例
反射调用方法
Object invoke(Object obj,Object...args)
:该方法中的obj是执行该方法的主调,后面的args是执行该方法时传入该方法的实参
public
class
Test {
public
Test(String str) {
System.out.println(str);
}
public
void
getInfo(String str){
System.out.println(str);
}
}
public
class
ClassInfo {
public
static
void
main(String[] args)
throws
Exception { Class<Test> cls=Test.
class
; Constructor<Test>construct=cls.getConstructor(String.
class
); Test test=construct.newInstance(
"初始化"
); Method med=cls.getMethod(
"getInfo"
, String.
class
);
med.invoke(test,
"调用方法成功"
);
}
}
初始化
调用方法成功
public
class
Test {
public
Test(String str) {
System.out.println(str);
}
//私有方法
private
void
getInfo(String str){
System.out.println(str);
}
}
public
class
ClassInfo {
public
static
void
main(String[] args)
throws
Exception { Class<Test> cls=Test.
class
; Constructor<Test>construct=cls.getConstructor(String.
class
); Test test=construct.newInstance(
"初始化"
);
//为啥使用这个方法呢?
Method med=cls.getDeclaredMethod(
"getInfo"
, String.
class
);
//为啥使用这个方法呢?
med.setAccessible(
true
);
med.invoke(test,
"调用方法成功"
);
}
}
初始化
调用方法成功
访问成员变量值
getXxx(Object obj)
:获取obj对象的该成员变量的值。此处的Xxx对应8种基本类型,如果该成员变量的类型是引用类型的,则去掉Xxx部分setXxx(Object obj,Xxx val)
:将obj对象的该成员变量设置为val值。此处的Xxx对应8中基本类型,如果该成员变量的类型是引用类型,则取消set后面的Xxx
public
class
Test {
private
int
num;
public
Test(String str) {
System.out.println(str);
}
private
void
getInfo(String str){
System.out.println(str);
}
public
int
getNum() {
return
num;
}
public
void
setNum(
int
num) {
this
.num = num;
}
}
public
class
ClassInfo {
public
static
void
main(String[] args)
throws
Exception { Class<Test> cls=Test.
class
; Constructor<Test>construct=cls.getConstructor(String.
class
); Test test=construct.newInstance(
"初始化"
); Method med=cls.getDeclaredMethod(
"getInfo"
, String.
class
);
med.setAccessible(
true
);
med.invoke(test,
"调用方法成功"
); Field fld=cls.getDeclaredField(
"num"
);
fld.setAccessible(
true
);
fld.setInt(test,
12
); System.out.println(fld.getInt(test));
}
}
初始化
调用方法成功
12
操作数组
public
class
ArrayInfo {
public
static
void
main(String[] args) { Object arrays=Array.newInstance(String.
class
,
3
); Array.set(arrays,
0
,
"第一个"
); Array.set(arrays,
1
,
"第二个"
); Array.set(arrays,
2
,
"第三个"
);
System.out.println(Array.get(arrays,
2
));
}
}
- Java反射获取类和对象信息全解析
- Java反射获取类和对象信息全解析
- Java反射获取类和对象信息全解析
- Java反射获取类和对象信息全解析
- Java反射获取类和对象信息全解析
- Java反射获取类和对象
- java反射之获取对象信息
- Java反射获取类信息
- java反射获取类信息
- 反射之获取对象信息
- 反射之获取对象信息
- Java基础——反射之获取对象信息
- 反射获取对象实例的字段信息和字段值
- java反射获取类的信息
- Java反射之获取类的信息
- Java基础-利用反射获取类信息
- Java反射机制-获取类信息
- Java反射机制:从对象获取类的所有方法信息
- div内容换行(隐藏)
- 关于Java泛型探究二
- yum源失效问题 网易 阿里等国内镜像失效
- CDL(协同深度学习)——一种基于深度学习的推荐系统
- node stream 流操作
- Java反射获取类和对象信息全解析
- 【Python学习笔记】-Python之zip()函数
- C# 压缩、解压缩类
- VIM快速移动光标到行首行尾及特定行
- iframe跨域通信
- Android 浅谈弱引用WeakReference
- MySQL几个概念
- python字符串title(),upper(),lower(),capitalize(),swapcase()
- 回炉重造,第十三话:php数组查找