Class
类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口
通过Class 能够获取类的信息,调用类的方法等。
一 生成Class对象
static Class<?> |
Class.forName(String className) className是类的全名 |
Class<?> |
ClassLoader.loadClass(String name) name 是类的全名
ClassLoader来源:
1.Thread.currentThread().getContextClassLoader()
2.Class实例.getClassLoader() //Class对应的类最好不是jdk里的类
3.ClassLoader.getSystemClassLoader()
|
|
直接引用 类名.class
|
|
类实例.getClass()
|
二 Class API
1.类型转换
a. Integer i = (Integer)obj;//强制类型转换,需要写死在代码里
b. Class类的方法: public T cast(Object obj) :
Integer i =Integer.class.cast(obj);//将Object 转换为Integer类型
2. 类Annotation信息
a.该Class对象代表的类是否标注了指定的Annotation
public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) {
b.该Class对象代表的类是否标注了指定的Annotation,则返回该Annotation,否则返回 null。
public <A extends Annotation> A getAnnotation(Class<A> annotationClass)
c. 返回Class对象代表的类上标注的所有Annotation。
public Annotation[] getAnnotations()
3.从类路径上获取资源
a.从类路径上获取指定名称的资源并返回它的输入流 ,name为资源的类路径全名,如/com/test/app/photo.jpg
public InputStream getResourceAsStream(String name);
b.从类路径上获取指定名称的资源,并返它的URL,name为资源的类路径全名,如/com/test/app/config.xml
public java.net.URL getResource(String name);
4.判断Class表示的类的类型
a.该Class对象代表的类是否是一个Annotation
public boolean isAnnotation()
b. 该Class对象代表的类是否是一个数组
public boolean isArray()
c. 该Class对象代表的类是否是一个枚举
public boolean isEnum()
d. 该Class对象代表的类是否是一个接口
public boolean isInterface()
e. 该Class对象代表的类是否是一个基本类型 (boolean、byte、char、short、int、long、float 和 double )+ void
public boolean isPrimitive();
5.获取类中内部类
a.返回该Class对象代表的类及其父类中的所有public的内部类
public Class<?>[] getClasses()
b. 返回该Class对象代表的类中所有内部类(公共、保护、默认(包)访问及私有的内部类)(不含父类中的内部类)
public Class<?>[] getDeclaredClasses()
6. 获取类的父类或接口
a.返回该Class对象代表的类的实现的直接接口,带有泛型类型信息(接口可以有多个)
public Type[] getGenericInterfaces()
b.返回该Class对象代表的类的实现的直接接口 (接口可以有多个)
public Class<?>[] getInterfaces();
c.返回该Class对象代表的类的扩展的直接父类,带有泛型类型信息(父类只有一个)
public Type getGenericSuperclass()
d. 返回该Class对象代表的类的扩展的直接父类 (父类只有一个)
public Class<? super T> getSuperclass()
7.获取类中定义的泛型参数
public TypeVariable<Class<T>>[] getTypeParameters()
//System.out.println(Arrays.asList(List.class.getTypeParameters())); 输出为[E]即List定义时的泛型:public interface List<E>
8.数组类,获取其实例化时的类型
public Class<?> getComponentType()
//Object [] objs = new String [5];
//Class classz = objs.getClass().getComponentType();
//System.out.println(classz.getName()); 输出为java.lang.String
9.获取类的构建器
a.获取类的所有public的构建器
public Constructor<?>[] getConstructors()
b.根据构建器参数类型获取指定的public的构建器
public Constructor<T> getConstructor(Class<?>... parameterTypes)
Constructor<String> constructor = String.class.getConstructor(String.class);
System.out.println(constructor);
//输出:public java.lang.String(java.lang.String)
c.获取类的所有构建器(含公共、保护、默认(包)访问和私有构建器及默认构建器 )
public Constructor<?>[] getDeclaredConstructors()
d.根据构建器参数类型获取指定的构建器(可以是公共、保护、默认(包)访问和私有构建器及默认构建器 )
public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
10.获取类的属性
a.获取类的所有public的属性
public Field[] getFields()
b.根据属性名称获取指定的public的属性
public Field getField(String name)
c.获取类的所有属性(含公共、保护、默认(包)访问和私有属性 )
public Field[] getDeclaredFields()
d.根据属性名称获取指定的public的属性(可以是公共、保护、默认(包)访问和私有属性 )
public Field getDeclaredField(String name)
11.获取类的方法
a.获取类及父类的所有public的方法
public Method[] getMethods()
b.根据方法名及方法参数类型 从类或父类中获取指定的public的方法
public Method getMethod(String name,Class<?>... parameterTypes)
c.获取类及父类的所有的方法(含公共、保护、默认(包)访问和私有方法 )
public Method[] getDeclaredMethods()
d.根据方法名及方法参数类型 从类或父类中获取指定的方法(可以是公共、保护、默认(包)访问和私有方法 )
public Method getDeclaredMethod(String name, Class<?>... parameterTypes)
三 Constructor API
四 Field API
五 Method API
六 实例化类
方式:
a.构建器方法无参数的:Class.newInstance()
b.构建器有参数的:通过参数类型获取构建器,再通过构建器生成类实例
Constructor constructor = getDeclaredConstructor(Class<?>... parameterTypes);
constructor.newInstance(Object... initargs);
七 判断类实例是否为某个类或接口的实例
a. 对象实例 instaceof 类A (需要在代码里写死)
对象实例 是否是类A的实例或其子类的实例
b. classA.isInstance(Object obj ) (可动态)
对象实例obj 是否是classA的实例或其子类的实例
c. classA.isAssignableFrom(Class classB) (可动态)
classB是否是ClassA类或其子类
八 Array API:
public void readArray(Object obj){
if(obj.getClass().isArray()){
int length = Array.getLength(obj);
for(int index=0;index<length;index++){
System.out.print(Array.get(obj, index));//输出0123456789
}
}
}
public Object createIntArray(int length) throws Exception{
Object obj = Array.newInstance(Integer.class, length);
for(int index=0;index<length;index++){
Array.set(obj, index, index);
}
return obj;
}
调用:
Object obj = createIntArray(10 );
readArray(obj );
九 BeanInfo
对 JavaBean进行反射
Introspector API:
static BeanInfo |
getBeanInfo(Class<?> beanClass) 在 Java Bean 上进行内省,了解其所有属性、公开的方法和事件。
( 含父类)
通获取JavaBean中的【public 类型 getXXXX()】方法,xxxx认为是属性,虽然有可能没有这个属性。(非public的方法获取不到)
|
static BeanInfo |
getBeanInfo(Class<?> beanClass, Class<?> stopClass) 在给定的“断”点之下,在 Java Bean 上进行内省,了解其所有属性和公开的方法。 (对指定的父类(stopClass) 不进行内省)
|
BeanInfo API:
PropertyDescriptor API:
MethodDescriptor API:
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
public class UserBean {
String name="ting";
int age=20;
String sex="female";
public String getAddress(){//通过这个方法名,获取到Address属性,虽然这个属性不存在
return null;
}
String getName() {//获取不到Name属性,因为不是Public的
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void setSex(String sex) {//获取不到Sex属性,因不没有getSex()方法
this.sex = sex;
}
public static void main(String args []){
try{
BeanInfo beanInfo = Introspector.getBeanInfo(UserBean.class,Object.class);//object 类不进行内省,否则BeanInfo会多一些Object里的方法
PropertyDescriptor propertyDescriptors [] = beanInfo.getPropertyDescriptors();//获取所有属性
for(PropertyDescriptor pd :propertyDescriptors){//遍历
String propertyName = pd.getName();//获取属性名
Class type = pd.getPropertyType();//获取属性类型
Method readMethod = pd.getReadMethod();//获取读取方法 getXXXX()
Method writeMethod = pd.getWriteMethod();//获取设置方法 setXXX( )
if(readMethod != null ){
UserBean userBean = new UserBean();
Object obj = readMethod.invoke(userBean, null);//调用读取方法
System.out.println(" propertyName="+propertyName+", class="+type+" ,currentValue="+obj); //输出:
// propertyName=address, class=class java.lang.String ,currentValue=null
// propertyName=age, class=int ,currentValue=20
// propertyName=sex, class=class java.lang.String ,currentValue=female
}
}
}catch(Exception e){
e.printStackTrace();
}
}
}
相关推荐
在本文中,我们将深入探讨如何使用MATLAB进行反射阵天线单元相位的计算,这是无线通信和雷达系统中的一个重要概念。MATLAB是一种强大的数学计算软件,尤其适用于数值分析和算法开发,因此它是处理此类问题的理想工具...
对于P波来说,有两个重要的反射系数:P波反射系数(用于P波的反射)和SV波反射系数(用于剪切波,即S波的垂直分量的反射)。这里我们主要关注P波反射系数。 P波反射系数(R_PP)的计算公式为: \[ R_{PP} = \frac{\...
光纤Bragg光栅(FBG)是一种在光纤内部制造的光学元件,它利用光的布拉格反射原理工作。这种光栅能够在特定的波长上反射光,而在其他波长上则允许光通过,因此在光纤通信、传感器和光谱学等领域有广泛应用。下面将...
本压缩包"computing-reflecting-series.rar"提供了一种使用MATLAB进行反射波模拟和处理的方法,主要涉及以下几个核心知识点: 1. 反射波:在地球内部不同介质的界面,地震波会部分反射,部分透射。这些反射波携带了...
《3D蒙特卡洛光线追迹:MATLAB实现光线反射与散射解析》 在计算机图形学领域,光线追迹是一种广泛应用于渲染的技术,它模拟光线如何在虚拟环境中传播,从而产生逼真的图像效果。当涉及到3D空间中的复杂光学现象时,...
unity镜面反射脚本,包里4个文件 Mirror.cs :与shader互动的脚本,使用这组材质同时要把这个脚本拖给使用的物体才能生效 Mirror-BumpSpec.shader 实时镜面反射shader 可以配合法线贴图一起用 适用于平面物体 ...
在IT领域,尤其是在电磁学和信号处理中,计算多层媒质的反射和透射系数是一项重要的任务。这个过程涉及到对电磁波在不同介质界面之间的交互进行数学建模,以便理解光、无线电波或其他电磁辐射如何在不同材料之间传播...
反射获取Class类对象的三种方法 2.1 通过全类名的方式获取 2.2 类名.class 2.3 实例对象.getClass() 2.4 总结 3. 反射获取属性变量 3.1 获取所有public修饰符的成员变量 3.2 获取指定字段并赋值 3.3 获取...
标题中的"matlab模拟光的反射折射.pdf"指的是使用MATLAB软件进行光学现象的模拟,具体是关于光的反射和折射。MATLAB是一款强大的数学计算和数据可视化软件,它可以用于创建复杂的模型和模拟实验,包括物理学中的光学...
根据提供的文档信息,本文将详细解释与FBG(光纤布拉格光栅)反射谱仿真的核心概念、原理以及具体的MATLAB实现方法。本篇内容主要包括以下几个方面: ### 一、FBG基本理论介绍 #### 1.1 FBG定义 FBG(Fiber Bragg ...
在讨论C++反射机制实现的过程中,我们首先需要明确反射机制的概念和分类。反射的定义源自人工智能领域,它主要涉及到两种反射结构:结构反射和计算反射。结构反射侧重于元类与类之间的关系,计算反射则关注于计算...
### 反射实例—JAVA反射机制 #### 一、反射概念及原理 反射在计算机科学领域,特别是程序设计中,是指程序有能力访问、检测和修改其自身的结构和行为。这一概念最早由Smith于1982年提出,并迅速应用于各种编程语言...
在Unity中,实现镜面反射的效果是通过Shader来完成的,Shader是一种编程语言,它可以控制场景中的物体如何在屏幕上显示。在本主题中,我们将深入探讨Unity3D中的镜面反射Shader及其实现。 镜面反射在图形学中是一个...
在光学领域,光栅反射谱是一种重要的实验技术,用于研究物质对不同波长光的反射特性。MATLAB作为一款强大的数值计算与可视化软件,被广泛应用于科学计算和工程仿真,包括光栅反射谱的模拟。以下将详细阐述光栅反射谱...
《MODIS地表反射率产品说明书》是一份详尽的技术文档,主要针对MODIS(Moderate Resolution Imaging Spectroradiometer)卫星的地表反射率产品,提供了深入的理论基础、产品特性以及应用指导。MODIS是搭载在NASA的...
“反射”其实就是利用程序集的元数据信息。 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间。 1、假设你要反射一个 DLL 中的类,并且没有引用它(即未知的类型): Assembly assembly = ...
在光学设计领域,Zemax是一款广泛使用的光学设计软件,它能帮助工程师们设计和优化各种光学系统,包括反射式系统。反射式系统是利用反射镜而不是透镜来聚焦光线的光学系统,通常用于天文望远镜、激光器、成像设备等...
标题中的“多层膜_三层膜的反射率计算_石墨烯_”指的是在光学领域中,关于多层薄膜(具体为三层膜)结构的反射率计算,特别是涉及到石墨烯这种材料的情况。石墨烯是一种由单层碳原子构成的二维材料,具有极高的电导...