Class类

在Java中,每个class都有一个相应的Class对象。也就是说,当我们编写一个类,编译完成后,在生成的.class文件中,就会产生一个Class对象,用于表示这个类的类型信息。

反射

Java的反射主要就是使用class对象生成对应类的实例、调用类的方法等对操作。示例代码:

Car.java

public class Car {

	private String brand;

	private String color;

	private Integer maxSpeed;

	public Car() {
} public Car(String brand, String color, Integer maxSpeed) {
super();
this.brand = brand;
this.color = color;
this.maxSpeed = maxSpeed;
} public String getBrand() {
return brand;
} public void setBrand(String brand) {
this.brand = brand;
} public String getColor() {
return color;
} public void setColor(String color) {
this.color = color;
} public Integer getMaxSpeed() {
return maxSpeed;
} public void setMaxSpeed(Integer maxSpeed) {
this.maxSpeed = maxSpeed;
} @Override
public String toString() {
return "Car [brand=" + brand + ", color=" + color + ", maxSpeed="
+ maxSpeed + "]";
} public void testPrivate() {
System.out.println("call testPrivate()");
} }

ReflectTest.java

public class RelectTest {

	public static void main(String[] args) throws ClassNotFoundException,
InstantiationException, IllegalAccessException, SecurityException,
NoSuchFieldException, NoSuchMethodException,
IllegalArgumentException, InvocationTargetException {
// 创建class,方法1
Class<?> clazz = Class.forName("com.Car");
// 创建class,方法2,相对来说,方法1更适合从配置中读取包的限定名字符串,避免了方法2中需要导包的操作
clazz = Car.class;
// 创建对象
Car car = (Car) clazz.newInstance();
// 获取所有的属性
Field[] fields = clazz.getDeclaredFields();
System.out.print("All fields:");
for (Field field : fields) {
System.out.print(field.getName() + ",");
}
System.out.println();
// 获取所有的public属性
Field[] publicFilds = clazz.getFields();
System.out.print("All public fields:");
for (Field field : publicFilds) {
System.out.print(field.getName() + ",");
}
System.out.println();
// 获取继承或接口中的所有方法
Method[] methods = clazz.getMethods();
System.out.println("All methods:");
for (Method method : methods) {
System.out.println(method.getReturnType() + " " + method.getName()
+ "(" + displayClass(method.getParameterTypes()) + ")");
}
System.out.println();
// 获取本类中的public, protected, private方法,不包括继承的方法
Method[] selfMethods = clazz.getDeclaredMethods();
System.out.println("All self methods:");
for (Method method : selfMethods) {
System.out.println(method.getReturnType() + " " + method.getName()
+ "(" + displayClass(method.getParameterTypes()) + ")");
}
System.out.println();
// 获取构造函数
Constructor[] constructors = clazz.getDeclaredConstructors();
System.out.println("All Constructor:");
for (Constructor constructor : constructors) {
System.out.println(constructor.getName() + "("
+ displayClass(constructor.getParameterTypes()) + ")");
}
System.out.println(); // 获取指定的属性
Field brandField = clazz.getDeclaredField("brand");
// 通过属性为字段赋值
brandField.setAccessible(true);// 由于brand属性为private,必须设置覆盖java对该字段的访问控制检查
brandField.set(car, "奔驰");
System.out.println(car); // 获取指定的方法
Method colorSetMethod = clazz.getDeclaredMethod("setColor",
String.class);
colorSetMethod.invoke(car, "黑色");
System.out.println(car); Method testPrivateMethod = clazz.getDeclaredMethod("testPrivate");
testPrivateMethod.invoke(car, null); } public static String displayClass(Class[] s) {
StringBuilder sb = new StringBuilder();
for (Class c : s) {
if (sb.length() > 0)
sb.append(", ");
sb.append(c.getName());
}
return sb.toString();
} }

Java反射的用法的更多相关文章

  1. java反射-- Field 用法实践

    java 反射是一种常用的技术手段, 通过加载类的字节码的方式来获取相关类的一些信息 比如成员变量, 成员方法等. Field 是什么呢? field 是一个类, 位于java.lang.reflec ...

  2. Java 反射经常用法演示样例

    <pre name="code" class="java">import java.lang.reflect.Constructor; import ...

  3. Java 反射的用法 有关Class类的解释

    package com.imooc.test;public class ClassDemo1 { public static void main(String[] args) { Foo fool = ...

  4. 不藏了,这些Java反射用法总结都告诉你们

    摘要:Java反射是一种非常强大的机制,它可以在同一个系统中去检测内部的类的字段.方法和构造函数.它非常多的Java框架中,都大量应用了反射技术,如Hibernate和Spring.可以说,反射机制的 ...

  5. Java Spring IOC用法

    Java Spring IOC用法 Spring IoC 在前两篇文章中,我们讲了java web环境搭建 和 java web项目搭建,现在看下spring ioc在java中的运用,开发工具为In ...

  6. Java反射的理解

    反射的作用:   1.运行时检查类的结构 2.运行时更改类的字段值 3.调用类的方法   准备知识:   Class类:虚拟机为每一个对象保存的一份对象所属类的清单: static Class for ...

  7. java 反射 动态代理

    在上一篇文章中介绍Java注解的时候,多次提到了Java的反射API.与javax.lang.model不同的是,通过反射API可以获取程序在运行时刻的内部结构.反射API中提供的动态代理也是非常强大 ...

  8. java反射机制 + Method.invoke解释 getMethod + 反射理解

    功能: 通过读取另一个Dll去创建一个控件(Form,Button,TextBox,DataGridView),然后对当中一些属性进行检查. 创建控件的大致流程是,Assembly->Modul ...

  9. Java反射机制深度剖析

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! Java反射机制是Java语言中一种很重要的机制,可能在工作中用到的机会不多,但是在很多框架中都有用到这种机制.我们知道Java是一门静态 ...

随机推荐

  1. 十分钟教你使用NoteExpress

    http://www.a-site.cn/article/761794.html 如果你正走在读研的路上,不管是什么专业,日常生活中都少不了读文献.读文献和读文献. 与其等到文献堆积如山,给阅读和使用 ...

  2. Android github上的好的开源项目汇总

    转自:http://blog.csdn.net/ithomer/article/details/8882236 GitHub 上的开源项目不胜枚举,越来越多的开源项目正在迁移到GitHub平台上.基于 ...

  3. DQN(Deep Reiforcement Learning) 发展历程(三)

    目录 不基于模型(Model-free)的预测 蒙特卡罗方法 时序差分方法 多步的时序差分方法 参考 DQN发展历程(一) DQN发展历程(二) DQN发展历程(三) DQN发展历程(四) DQN发展 ...

  4. jqgrid 设置多表头

    有时,我们需要给jqgrid设置多表头信息,多表头区域会有行合并/列合并,如何实现? 1)通过jqgrid的 setGroupHeaders 方法来实现一个行的多表头, 2)如果有多行表头,需要设置多 ...

  5. W25Q128BV W25Q128FV W25Q128JV 什么区别?

    W25Q128BV  W25Q128FV  W25Q128JV  什么区别?    官网没有找到  BV 的相关信息, 倒是有 FV,FW,JV,JW 信息..2019年1月19日19:09:55 F ...

  6. 线程池原理及python实现

    为什么需要线程池 目前的大多数网络服务器,包括Web服务器.Email服务器以及数据库服务器等都具有一个共同点,就是单位时间内必须处理数目巨大的连接请求,但处理时间却相对较短. 传统多线程方案中我们采 ...

  7. ex6教程

    一.信息搜集 1.外围信息搜集 外围信息搜集又叫公开渠道信息搜集. 搜索引擎,公共信息库,目标门户网站等等都是很好的入手点. metasploit有一类"辅助模块",可以帮助你进行 ...

  8. [Oracle]跨越 DBLINK 访问表时,数据缓存在何处的Data Buffer 中?

    结论是存储在 remote 端,这其实也很好理解.在远端能高效率地计算,当然应当在远端完成缓存和检索. ■ Before query execution via DBLINK: =========== ...

  9. Verilog中的有符号计算之认知补码

    Verilog中的有符号计数,一般是自己定义的而不是像C语言之类的定义一个有符号变量就好了.所以,要想在FPGA的世界里随心所欲的进行有符号运算,必须先对补码有一个很好的认知,然后再注意Verilog ...

  10. R语言学习 第四篇:函数和流程控制

    变量用于临时存储数据,而函数用于操作数据,实现代码的重复使用.在R中,函数只是另一种数据类型的变量,可以被分配,操作,甚至把函数作为参数传递给其他函数.分支控制和循环控制,和通用编程语言的风格很相似, ...