`
kkllmey
  • 浏览: 103575 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java 反 - 射

阅读更多

获取一个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反射机制

    ### 反射实例—JAVA反射机制 #### 一、反射概念及原理 反射在计算机科学领域,特别是程序设计中,是指程序有能力访问、检测和修改其自身的结构和行为。这一概念最早由Smith于1982年提出,并迅速应用于各种编程语言...

    Linux下 Java Decompiler

    反编译必不可少的利器。 1. 支持对整个Jar文件进行反编译,并本源代码可直接点击进行相关代码的跳转  2. 支持众多Java编译器的反编译(支持泛型, Annotation和enum枚举类型)[1]

    Java企业面试题整理及答案

    ### Java企业面试题知识点梳理 #### 一、Java面向对象基础 **1. super()与this()的区别** - **super()**: 是指父类构造器的引用,用于调用父类的构造方法或访问父类的成员。在子类构造器中使用 `super()` 可以调用...

    反 射 应 用.rar

    Java的泛型在编译后会被擦除,反射可以帮助我们获取泛型类型信息,这对于实现类型安全的代码容器或者序列化/反序列化等操作很有帮助。 6. **注解处理** 反射可以用来读取和处理类、方法、字段上的注解,这对于...

    jackson-annotations jackson-core jackson-databind

    3. **jackson-databind**:这是Jackson最常用的部分,实现了将Java对象映射到JSON和从JSON反映射回Java对象的功能,即所谓的对象-图映射(Object-Mapping)。它依赖于`jackson-annotations`和`jackson-core`,通过`...

    java反射视频

    根据提供的信息,我们可以总结出以下关于Java反射机制的相关知识点: ### Java反射机制简介 Java反射是一种强大的工具,它允许程序在运行时访问类、构造器、方法和字段的信息,并能够创建对象、调用方法等。这为...

    用java实现的四叉树编码源码

    Morton码,又称为Z-order曲线,是将多维数据点映射到一维空间的一种方法。它通过交错各个维度的二进制位来实现,使得具有相近坐标的点在一维表示中也相邻。Morton码在四叉树编码中的作用是,通过将四叉树节点的坐标...

    Windows反编译apk(小寒工具箱)

    2. **Java反编译**:将.jar文件反编译为可读的Java源代码是理解应用程序逻辑的关键。常用的工具有JD-GUI或Procyon。这些工具将字节码转换回接近原始的Java源代码形式,虽然可能无法完全恢复原始代码,但足够理解和...

    JSP的SHA加密

    它将任意长度的输入(也叫做预映射)通过散列函数转换成固定长度的输出,这个输出就是散列值。SHA家族包括SHA-1、SHA-256、SHA-384和SHA-512等不同版本,它们在安全性和计算复杂度上有所不同。 1. **SHA-1与SHA-256...

    Enigma:这是Cuchaz的engima(用于Java软件的反混淆重映射工具)的分支

    用于清除Java字节码的工具。 从分叉,版权Jeff Martin。 执照 Enigma是根据。 Enigma包含以下开放源代码库: 的(Apache-2.0) (MIT)的 (Apache-2.0) (Apache-2.0) (Apache-2.0) (MIT) (BSD-3-...

    整合了所有java经典面试题

    - 使用`java.io.ObjectOutputStream`和`java.io.ObjectInputStream`类来序列化和反序列化对象。 7. **一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?** - 可以包含多个类,但只有一个公共...

    基于Java的愤怒的小鸟游戏的设计与实现.zip

    游戏的类型版本是横向版本的水平视角,背景是为了报复偷鸡蛋的猪,鸟将自己的身体作为武器,就像炮弹一样从弹弓射出抛到绿猪搭建的堡垒,并将其摧毁。 游戏非常简单,小鸟跳上弹弓,发射角度和强度由玩家的自行控制...

    java经典面试

    - 使用`ObjectOutputStream`和`ObjectInputStream`类来进行序列化和反序列化。 #### 7. 一个".java"源文件中是否可以包括多个类(不是内部类)? - **可以**:一个`.java`文件中可以包含多个类,但是只能有一个...

    linux下反编译apk

    3. jd-linux(Java decompile) 是显示*.class文件。 用法: 第一步:apktool d [路径]/xxx.apk [指定目录](解压到指定目录,只能反编译xml文件) 第二步:sh [路径]/dex2jar/dex2jar.sh classes.dex。(当前目录下会...

    hepjet:用于HEP物理的Benchmak射流聚类算法库

    在反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...

    Java面试题整理精华

    除了实现`Serializable`接口外,还可以使用`Externalizable`接口,它提供了更精细的控制,允许自定义序列化和反序列化的过程。 #### 14. 如在COLLECTION框架中,实现比较要实现什么样的接口? 在集合框架中,如果...

    json_struts2.rar_JSON java_SSH json Struts2_java json_json_strut

    1. **JSON序列化与反序列化**:Java中,可以使用Jackson、Gson或内置的`java.json`包来将Java对象转化为JSON字符串,反之亦然。例如,Struts2提供了一个`JsonResult`动作结果类型,用于自动处理JSON响应。 2. **...

    secure-login:java中的散列密码示例

    散列(Hashing)是一种不可逆的过程,它将任意长度的输入(也称为预映射,pre-image)转化为固定长度的输出,通常称为散列值或指纹。在密码学中,散列函数常用于存储密码,因为即使原始密码泄露,散列后的值也无法...

    jackson 2.7.0 jar

    它实现了ObjectMapper类,是Jackson库中最重要的类,支持自动映射和反映射JSON到Java对象,反之亦然。 3. **jackson-annotations-2.7.jar**:这个模块包含了Jackson的注解,这些注解可以用来自定义对象到JSON的序列...

Global site tag (gtag.js) - Google Analytics