`
wuhoujian322
  • 浏览: 64469 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java基础知识回顾第七篇 - 反射Reflect

阅读更多

什么是java反射?核心在于一个对动态二字的理解,即:在运行状态中,能动态获取类的属性和方法,以及动态调用对象的属性和方法。

 

反射的作用:一方面用于反编译(.class到.java文件),另一方面用来动态访问对象的属性、方法等。

 

反射机制中主要的类:

java.lang.Class;                

java.lang.reflect.Constructor; 

java.lang.reflect.Field;        

java.lang.reflect.Method;

java.lang.reflect.Modifier;

 

下面贴出一些示例代码:

package com.tu.test.reflect;

 

import java.io.Serializable;

 

public class User implements Serializable{

private static final long serialVersionUID = 9016949872478554542L;

 

public User() {

 

}

public User(String name,int age,String phone){

this.name = name;

this.age = age;

this.phone = phone;

}

 

private String name;

private int age;

private String phone;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public String getPhone() {

return phone;

}

public void setPhone(String phone) {

this.phone = phone;

}

 

}

 

package com.tu.test.reflect;

 

import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

import java.lang.reflect.Modifier;

 

public class ReflectTest {

//获取User类型

public static void getUser() throws Exception{

/**1、获取类**/

//获取类的第一种方法

Class clz1 = Class.forName("com.tu.test.reflect.User");

//获取类的第二种方法(java中每个类型都有class属性)

Class clz2 = User.class;

//获取类的第三种方法(java中任何一个对象都有getClass()方法)

User user = new User();

Class clz3 = user.getClass();

 

/**2、创建对象**/

Object userObj = clz1.newInstance();

 

/**3、获取类的所有属性、方法等信息**/

Field[] fields = clz1.getDeclaredFields();

StringBuilder fieldSb = new StringBuilder();

for (Field field : fields) {

fieldSb.append(Modifier.toString(field.getModifiers())).append(" ");

fieldSb.append(field.getType().getName()).append(" ");

fieldSb.append(field.getName()).append(" ");

fieldSb.append("\n");

}

System.out.println("User类的所有属性信息:" + fieldSb.toString());

 

Method[] methods = clz1.getDeclaredMethods();

StringBuilder methodSb = new StringBuilder();

for (Method method : methods) {

methodSb.append(Modifier.toString(method.getModifiers())).append(" ");

methodSb.append(method.getReturnType().getName()).append(" ");

methodSb.append(method.getName()).append(" ");

 

Class<?>[] paramClzs = method.getParameterTypes();

methodSb.append("(");

for (Class<?> paramClz : paramClzs) {

methodSb.append(paramClz.getName());

}

methodSb.append(method.getParameterTypes()).append(")");

methodSb.append("\n");

}

System.out.println("User类的所有方法信息:" + methodSb.toString());

 

Constructor[] constructors = clz1.getConstructors();

for (Constructor constructor : constructors) {

System.out.println("构造方法:" + constructor.getName());

}

 

/**4、获取特定属性**/

Field name = clz1.getDeclaredField("name");

name.setAccessible(true);//反射机制可打破java封装

name.set(userObj, "wuhoujian");

System.out.println("My name is : " + name.get(userObj));

}

 

public static void main(String[] args) {

try {

getUser();

} catch (Exception e) {

e.printStackTrace();

}

}

}

 

输出结果:

User类的所有属性信息:private static final long serialVersionUID 

private java.lang.String name 

private int age 

private java.lang.String phone 

 

User类的所有方法信息:public int getAge ([Ljava.lang.Class;@19bb25a)

public void setAge (int[Ljava.lang.Class;@da6bf4)

public java.lang.String getPhone ([Ljava.lang.Class;@1e58cb8)

public void setPhone (java.lang.String[Ljava.lang.Class;@179935d)

public java.lang.String getName ([Ljava.lang.Class;@b9e45a)

public void setName (java.lang.String[Ljava.lang.Class;@3ef810)

 

构造方法:com.tu.test.reflect.User

构造方法:com.tu.test.reflect.User

My name is : wuhoujian

 

补充一个示例:

package com.ali.test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;

/**
 * Created by hjwue on 2016/11/24.
 */
public class DumpMethods {
    public static void main(String[] args) {
        try {
            Class myClass = Class.forName("java.util.HashMap");

System.out.println("Show all constructors:");
Constructor[] constructors = myClass.getDeclaredConstructors();
System.out.println("The size of all constructors is:" + constructors.length);
Arrays.asList(constructors).forEach(constructor -> System.out.println(constructor.toString()));

System.out.println("Show all public constructors:");
Constructor[] publicConstructors = myClass.getConstructors();
System.out.println("The size of all constructors is:" + publicConstructors.length);
Arrays.asList(publicConstructors).forEach(publicConstructor -> System.out.println(publicConstructor.toString()));

System.out.println("Show all fields:");
Field[] fields = myClass.getDeclaredFields();
System.out.println("The size of all fields is : " + fields.length);
Arrays.asList(fields).forEach(field -> System.out.println(field.toString()));

System.out.println("Show all public fields:");
Field[] publicFields = myClass.getFields();
System.out.println("The size of all public fields is : " + publicFields.length);
Arrays.asList(publicFields).forEach(publicField -> System.out.println(publicField.toString()));

System.out.println("Show all methods:");
Method[] methods = myClass.getDeclaredMethods();
System.out.println("The size of all method is : " + methods.length);
Arrays.asList(methods).forEach((m -> System.out.println(m.toString())));

System.out.println("Show all public methods:");
Method[] publicMethods = myClass.getMethods();
System.out.println("The size of all public method is : " + publicMethods.length);
Arrays.asList(publicMethods).forEach(publicMethod -> System.out.println(publicMethod.toString()));
} catch(Exception e){
            e.printStackTrace();
}
    }
}

 

注:关于上面为提到的操作方法,参考URL:http://tool.oschina.net/apidocs/apidoc?api=jdk-zh

API文档是一个很好的老师,大家平时要多查阅一下。

0
0
分享到:
评论

相关推荐

    java 反射-(reflect)

    Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类是`java.lang.Class`,它代表了类的信息。通过反射,我们可以动态地...

    java面试题--反射机制

    ### Java反射机制详解 #### 一、引言 在Java面试中,经常会出现与反射...以上内容不仅解释了Java反射机制的相关知识点,还通过示例代码进行了实践演示,希望能够帮助你在Java面试中更好地理解和运用这一重要特性。

    java中的反射reflect

    以下我们将深入探讨Java反射的基本概念、主要API以及如何通过给定的代码示例来理解反射的应用。 首先,让我们了解什么是类的反射。在Java中,`java.lang.Class` 类代表了运行时的类信息。我们可以通过一个类的全名...

    kotlin-reflect.jar

    kotlin-reflect.jar

    kotlin-reflect-1.3.70.jar

    Could not download kotlin-reflect.jar 这个问题 是墙的原因 没有下载下来kotlin-reflect.jar的jar包资源。 把下载的kotlin-reflect-1.3.70.jar,放在版本文件的子目录中,重新启动电脑就可以。网上都有对应的操作...

    2020老杜最新Java零基础进阶视频教程-反射机制课件

    【Java反射机制详解】 在Java编程中,反射机制是一个强大的工具,它允许程序在运行时检查自身,并且能够动态地操作类和对象的内部信息。这个特性使得Java代码具有高度的灵活性,能够在不修改源码的情况下,根据需要...

    scala-reflect-2.11.8-API文档-中英对照版.zip

    标签:reflect、scala、lang、jar包、java、API文档、中英对照版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准...

    Java软件开发实战 Java基础与案例开发详解 15-1 反射 共13页.pdf

    ### Java反射机制详解 #### 15.1 Java反射机制概览 ##### 15.1.1 什么是Java反射? 反射(Reflection)是Java语言的一个核心特性,它允许程序在运行时动态地获取对象类型信息,并且可以利用这些信息进行诸如创建...

    JAVA基础--JAVA中的反射机制详解

    在 Java 中,反射机制主要通过 java.lang.reflect 包中的类和接口来实现。下面是对反射机制的详细解释: 获取对象的属性 在 Java 中,可以使用反射机制来获取对象的属性。例如,以下代码可以获取某个对象的属性: ...

    java反射JAVA REFLECT (java 反射)

    JAVA REFLECT (java 反射) 取得类的继承结构 - 类所在的包; |- public Package getPackage() - 类的声明方式; |-取得全类名:public String getName() |-只取类名: public String getSimpleName() - 类所继承...

    java专题-反射

    ### Java反射机制详解 #### 引言 Java的反射机制是一种强大的编程工具,它使得Java程序能够在运行时检查和操作自身结构与行为的能力。这种能力不仅增强了Java的灵活性,也使其成为实现动态代理、框架搭建(如Spring...

    cpp-reflect在C17中轻松实现反射和序列化

    而"cpp-reflect在C++17中轻松实现反射和序列化"的主题则探讨了在C++17标准下,如何利用预C++20的手段来实现类似的功能,这对于想要提前尝鲜或者在不支持C++20的编译器环境下工作的人来说非常有价值。 反射通常包括...

    Java软件开发实战 Java基础与案例开发详解 15-3 反射与动态代理 共11页.pdf

    ### Java软件开发实战:反射与动态代理 #### 反射技术概述 反射是Java中一项强大的功能,允许程序在运行时获取类的信息并操作类的对象。这种能力在编写需要高度灵活性的应用程序时非常有用,例如在框架开发中,...

    java反射(reflect)

    Java反射(Reflect)是Java语言中的一个重要特性,它允许运行时的Java程序访问、操作类、接口、字段和方法的信息,甚至动态调用方法。在Java编程中,反射提供了强大的能力,可以用来实现一些高级功能,如元编程、...

    Java软件开发实战 Java基础与案例开发详解 16-5 利用反射获取标注信息 共7页.pdf

    Java SE 5.0 API中引入了`java.lang.reflect.AnnotatedElement`接口,它定义了用于反射性读取标注信息的四种方法: 1. **getAnnotation(Class annotationType)**:如果元素具有指定类型的标注,则返回这些标注;...

    反射实例-JAVA反射机制

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

    Android代码-Kotlin-Reflect-Tools-For-JVM

    This is a tool library for Kotlin to use java reflect APIs in Kotlin simply method.It can modify or read the top level private visible property value in Kotlin way. Note: This tools only availible ...

    kotlin-reflect-1.3.20.jar

    kotlin-reflect-1.3.20.jar

Global site tag (gtag.js) - Google Analytics