获取一个class所对应的Class有如下方法,每个class都有此getClass()方法
1.getClass()
String str = "accp";
Class c = str.getClass();
System.out.println(c);
//the result is : java.lang.String
即字符串所对应的Class为java.lang.String
2 getSuperClass()
获取指定类的父类所对应的Class
如果你对一个Object类调用getSuperClass(),你觉得会返回什么呢?
答案是: null
因为Object已经是所有类的父类,没有比它更高的,你这么调用的话
当然会返回null
3 Class.forName() 这个方法不陌生把
其中的参数必须是完整的包名加类名
Class.forName(java.lang.String); // return the Class of java.lang.String
4 .class 语法
起基本用法为: 类名+ ".class",返回此类所对应的Class
Class c1 = String.class;
Class c2 = int[].class; //因为数组也是引用类型
Class c3 = float.class; //原生类型也是可以的
5 原生数据类型的包装类
Class c1 = Boolean.TYPE;
Class c2 = Integer.TYPE;
Class c3 = Float.TYPE;
所有原生类型都可以用".TYPE"这种形式得到其对应的Class
当然用前面的方法也是可以的哦~
这5种方法说的差不多了把
我们再来看看如何在得到Class后,来生成特定类的实例
如果构造函数的参数为空,则可以用如下方法获取其实例
Student是一个类,有一个睡觉的方法 sleep() 其有个参数为空的构造方法
A: Class c = Class.forName("Student");
Student s = (Student) c.newInstance();
s.sleep();
我们可以用另一种写法,一样的效果,嘎嘎
B: Class c = Class.forName("Student");
Object obj = null ;
obj = c.newInstance(); //newInstance()方法返回的是Object类型
Student s = (Student) obj ;
s.sleep();
这样通过反射就可以得到实例
上面是针对没有参数的构造函数,如果有参数呢?
我们假设Student类有一个构造函数:Student(String name,Integer age);
Class c = Class.forName("Student"); //首先还是一样,获取类的Class
Class[] params = new Class[]{String.TYPE,Integer.TYPE}; //这两个参数对应构造函数中的那2个参数
Constructor ctor = c.getConstructor(params); //根据参数获取一个Constructor对象
Student s = (Student) ctor.newInstance(new Object[]{"admin",22}); 这样我们仍然可以得到Student的一个实例
s.sleep();
前面所说的是针对类的实例
下面来说说针对方法以及方法中的属性的例子
public String run(String name){
return name+"在听音乐。。。。。。" ;
}
方法:
Class c = Class.forName("Student");
Class params[] = new Class[]{String.TYPE};
Method m = c.getMethod("run","admin"); //第一个方法为指定类中的哪个方法的实例,第二个参数为此方法中的参数
Student stu = new Student () ;
String r = (String)m.invoke(stu,params); //第一个参数为调用哪个类的对象,第二个参数为此方法中的参数
此方法返回指定方法的返回值
System.out.println(r); //打印出来就是:admin在听音乐。。。。。。
运行时生成属性对象
我们的Student类有一个属性为String name
Class c = Class.forName("Student");
Field f = c.getField("name");
Student s = new Student();
System.out.println(f.get(s)); //取值
f.set(s,"admin"); //存值
--------------------------------------------------------------
反射取得属性:
protected void test( Object entity) throws IllegalArgumentException, IllegalAccessException {
Field[] fs = entity.getClass().getDeclaredFields(); // 取得属性
///////////////////fs[0].setAccessible(fs, true); //设置所的属性都可读写
for (Field f : fs) {
if (f.getType().equals(java.lang.String.class)) {
f.setAccessible(true); // 设置true,可以读写
f.set(entity, "accp"); // 重新给值
System.out.println(f.get(entity)); // 获取属性
}
}
}
///方法 Field getDeclaredField(String name):返回已加载类声明的所有成员变量的Field对象,不包括从父类继承的成员变量,参数name指定成员变量的名称.
分享到:
相关推荐
### 反射实例—JAVA反射机制 #### 一、反射概念及原理 反射在计算机科学领域,特别是程序设计中,是指程序有能力访问、检测和修改其自身的结构和行为。这一概念最早由Smith于1982年提出,并迅速应用于各种编程语言...
反编译必不可少的利器。 1. 支持对整个Jar文件进行反编译,并本源代码可直接点击进行相关代码的跳转 2. 支持众多Java编译器的反编译(支持泛型, Annotation和enum枚举类型)[1]
### Java企业面试题知识点梳理 #### 一、Java面向对象基础 **1. super()与this()的区别** - **super()**: 是指父类构造器的引用,用于调用父类的构造方法或访问父类的成员。在子类构造器中使用 `super()` 可以调用...
Java的泛型在编译后会被擦除,反射可以帮助我们获取泛型类型信息,这对于实现类型安全的代码容器或者序列化/反序列化等操作很有帮助。 6. **注解处理** 反射可以用来读取和处理类、方法、字段上的注解,这对于...
3. **jackson-databind**:这是Jackson最常用的部分,实现了将Java对象映射到JSON和从JSON反映射回Java对象的功能,即所谓的对象-图映射(Object-Mapping)。它依赖于`jackson-annotations`和`jackson-core`,通过`...
根据提供的信息,我们可以总结出以下关于Java反射机制的相关知识点: ### Java反射机制简介 Java反射是一种强大的工具,它允许程序在运行时访问类、构造器、方法和字段的信息,并能够创建对象、调用方法等。这为...
Morton码,又称为Z-order曲线,是将多维数据点映射到一维空间的一种方法。它通过交错各个维度的二进制位来实现,使得具有相近坐标的点在一维表示中也相邻。Morton码在四叉树编码中的作用是,通过将四叉树节点的坐标...
2. **Java反编译**:将.jar文件反编译为可读的Java源代码是理解应用程序逻辑的关键。常用的工具有JD-GUI或Procyon。这些工具将字节码转换回接近原始的Java源代码形式,虽然可能无法完全恢复原始代码,但足够理解和...
它将任意长度的输入(也叫做预映射)通过散列函数转换成固定长度的输出,这个输出就是散列值。SHA家族包括SHA-1、SHA-256、SHA-384和SHA-512等不同版本,它们在安全性和计算复杂度上有所不同。 1. **SHA-1与SHA-256...
用于清除Java字节码的工具。 从分叉,版权Jeff Martin。 执照 Enigma是根据。 Enigma包含以下开放源代码库: 的(Apache-2.0) (MIT)的 (Apache-2.0) (Apache-2.0) (Apache-2.0) (MIT) (BSD-3-...
- 使用`java.io.ObjectOutputStream`和`java.io.ObjectInputStream`类来序列化和反序列化对象。 7. **一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?** - 可以包含多个类,但只有一个公共...
游戏的类型版本是横向版本的水平视角,背景是为了报复偷鸡蛋的猪,鸟将自己的身体作为武器,就像炮弹一样从弹弓射出抛到绿猪搭建的堡垒,并将其摧毁。 游戏非常简单,小鸟跳上弹弓,发射角度和强度由玩家的自行控制...
- 使用`ObjectOutputStream`和`ObjectInputStream`类来进行序列化和反序列化。 #### 7. 一个".java"源文件中是否可以包括多个类(不是内部类)? - **可以**:一个`.java`文件中可以包含多个类,但是只能有一个...
3. jd-linux(Java decompile) 是显示*.class文件。 用法: 第一步:apktool d [路径]/xxx.apk [指定目录](解压到指定目录,只能反编译xml文件) 第二步:sh [路径]/dex2jar/dex2jar.sh classes.dex。(当前目录下会...
在反KT模式下工作nlojet-从NLOjet ++实现kT-jet jetn2_java -I.Pogrebnyak使用N * N FastJet方法实现的喷射算法的Java实现。 scjet_cpp -kT-jet /反kT(N * N * N)的替代(传统)实现scjet_java -Java中SCJet jet...
除了实现`Serializable`接口外,还可以使用`Externalizable`接口,它提供了更精细的控制,允许自定义序列化和反序列化的过程。 #### 14. 如在COLLECTION框架中,实现比较要实现什么样的接口? 在集合框架中,如果...
1. **JSON序列化与反序列化**:Java中,可以使用Jackson、Gson或内置的`java.json`包来将Java对象转化为JSON字符串,反之亦然。例如,Struts2提供了一个`JsonResult`动作结果类型,用于自动处理JSON响应。 2. **...
散列(Hashing)是一种不可逆的过程,它将任意长度的输入(也称为预映射,pre-image)转化为固定长度的输出,通常称为散列值或指纹。在密码学中,散列函数常用于存储密码,因为即使原始密码泄露,散列后的值也无法...
它实现了ObjectMapper类,是Jackson库中最重要的类,支持自动映射和反映射JSON到Java对象,反之亦然。 3. **jackson-annotations-2.7.jar**:这个模块包含了Jackson的注解,这些注解可以用来自定义对象到JSON的序列...