Java反射主要提供的功能有:在运行时判断任意一个对象所属的类;在运行时构建任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法、注解;在运行时调用任意一个对象的方法;生成动态代理。
示例代码如下:
package baseKnowledge;
import java.lang.annotation.Annotation;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ReflectionTest {
public static void main(String[] args) {
try {
I i = new A();
System.out.println(i.getClass());// class baseKnowledge.A
// 获取的是运行时的class
Class clazz = Class.forName("baseKnowledge.A");
A a = (A) clazz.newInstance(); // 构造运行时的对象
a.p();
System.out.println("\n==========getConstructors=============");
Constructor[] cs = clazz.getConstructors();// 只能获取public修饰的字段,以及父类public字段
for (Constructor c : cs) {
System.out.print(c.getParameterTypes().length + " | ");// 2 |
}
System.out.println("\n==========getConstructors=============");
Constructor[] cs2 = clazz.getDeclaredConstructors();// 只能获取public修饰的字段,以及父类public字段
for (Constructor c : cs2) {
System.out.print(c.getParameterTypes().length + " | ");// 0 | 1
// | 3 |
// 2 |
}
System.out.println("\n==========getFields=============");
Field[] fs = clazz.getFields();// 只能获取public修饰的字段,以及父类public字段
for (Field f : fs) {
System.out.print(f.getName() + " | ");// puF_a | pa_pub_f |
}
System.out.println("\n=========getDeclaredFields==============");
Field[] fs2 = clazz.getDeclaredFields();// 只能获取自己的所有字段(不包括父类)
for (Field f : fs2) {
System.out.print(f.getName() + " | ");// puF_a | deF_a | proF_a
// | priF_a |
}
System.out.println("\n=========getMethods==============");
Method[] ms = clazz.getMethods();// 可以获取自己以及父类的public方法
for (Method m : ms) {
System.out.print(m.getName() + " | ");// p | methodA | getClass
// | hashCode | equals |
// toString | notify |
// notifyAll | wait |
// wait | wait |
}
System.out.println("\n=======getDeclaredMethods================");
Method[] ms2 = clazz.getDeclaredMethods();// 只能获取自己的所有发方法(不包括父类)
for (Method m : ms2) {
System.out.print(m.getName() + " | ");// p2 | p3 | p4 | p |
}
System.out.println("\n=======getAnnotations================");
Annotation[] as = clazz.getAnnotations();// 获取包含父类的注解,此注解必须是@Inherited以及@Retention(RetentionPolicy.RUNTIME)类型
for (Annotation an : as) {
System.out.print(an.annotationType() + " | ");// interface
// baseKnowledge.an
// |
}
System.out.println("\n=======getDeclaredAnnotations================");
Annotation[] as2 = clazz.getDeclaredAnnotations();// 获取自己的注解
for (Annotation an : as2) {
System.out.print(an.annotationType() + " | ");//
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
interface I {
public void p();
}
class A extends parent implements I {
public String puF_a;
String deF_a;
protected String proF_a;
private String priF_a;
A() {
}
private A(String a) {
}
protected A(String a, String b, String c) {
}
public A(String a, String b) {
}
@Override
public void p() {
System.out.println("public method p ");
}
private void p2() {
System.out.println("private method p2");
}
void p3() {
System.out.println(" method p3");
}
protected void p4() {
System.out.println("protected method p4");
}
}
@an("")
class parent {
protected String pa_pro_f;
String pa_def_f;
public String pa_pub_f;
private String pa_pri_f;
public void methodA() {
System.out.println("public methodA");
}
void methodB() {
System.out.println("public methodB");
}
protected void methodC() {
System.out.println("protected methodC");
}
private void methodD() {
System.out.println("private methodD");
}
}
class B implements I {
@Override
public void p() {
System.out.println("class B");
}
}
@Retention(RetentionPolicy.RUNTIME) // 这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使用反射机制的代码所读取和使用.
@Inherited // 允许子类继承父类的注解。
@interface an {
String value();
}
1、构造方法
Constructor[] getConstructors() 获取public构造的所有方法
Constructor getConstructor(Class... parameterTypes) 获取public且传入方法参数类型和构造方法参数类型一一对应的构造方法
Constructor[] getDeclaredConstructors() 获取本类所有的构造方法
Constructor getDeclaredConstructor(Class... parameterTypes) 获取传入方法参数类型和构造方法参数类型一一对应的构造方法,不论该构造方法是否是public修饰
2、字段
Field[] getFields() 获取所有public修饰的字段,包括其继承的字段
Field getField(String name) 获取指定字段名称的所有且包括继承的public修饰的字段
Field[] getDeclaredFields() 获取本类自己的所有的字段
Field getDeclaredField(String name) 获取本类指定的名称的字段,无论是否为public修饰的字段
注:字段名称区分大小写
3、方法
Method[] getMethods() 获取所有public修饰的以及继承的方法
Method getMethod(String name,Class... parameterTypes) 获取指定方法名称以及方法参数类型的方法。该方法为public修饰的,可以是其继承的public方法。
Method[] getDeclaredMethods() 获取本类自己的所有的方法
Method getDeclaredMethod(String name,Class... parameterTypes) 获取指定方法名称以及方法参数类型的方法。该方法只能为本类自己的所有的方法
注:字段名称区分大小写
4、注解
Annotation[] getAnnotations() 获取所有修饰的以及继承的注解
Annotation getAnnotation(Class parameterTypes) 获取该类指定的注解
Annotation[] getDeclaredAnnotation() 获取本类的所有的注解
注:只有被@Inherited 标注过的注解,才能被子类继承;只有被@Retention(RetentionPolicy.RUNTIME)标注过的注解,才能被JVM保留,才能在运行时,被JVM获取其他的使用反射机制的代码读取和使用。因此,只有同时被这两种注解标注过的注解,才可以从父类中继承到。
5、初始化对象
Object newInstance() 只有含有非private修饰无参的构造方法,才可以使用此方法去构造对象。
分享到:
相关推荐
04_网络拓扑绘制技能专题 05_eNSP华为网络设备仿真平台 06_以太网二层交换基础 07_STP生成树协议基础 08_实现VLAN间的通信 09_以太网端口镜像(含报文分析)和链路聚合 10_Smart_Link_&_Monitor_Link 11_IP...
我们要求参与者在开始撰写RJ之前和之后,回答与6个标准相对应的反射性练习技能(RPS)问题,这些标准与Gibbs在反射性循环中的六个问题相对应。 反思性写作的数量是由PHN学生在三个月的反思性练习的RJ中书写的字符数...
JAVA面试技能点总结,深入源码及原理分析,设计JAVA基础、多线程、同步机制、JAVA虚拟机、GC、异常、反射、SPRING事务原理、MYSQL存储引擎及原理、REDIS、EHCACHE、MYCAT、KAFKA、MQ等
着力让读者在充分理解Java语言和Java类库的基础上,灵活应用Java提供的高级特性,具体包括面向对象程序设计、反射与代理、接口与内部类、异常处理、泛型程序设计、集合框架、事件监听器模型、图形用户界面设计和并发...
掌握Java语法和基础:掌握Java的语言特性、数据类型、运算符、控制结构、面向对象编程等基础知识点。 掌握Java标准库:掌握Java标准库中的重要类和接口,如String、ArrayList、HashMap、Thread、Socket等。 掌握Java...
企业架构师必备技能(JAVA核心技术反射) JavaWeb之基础(手写实现Tomcat服务器) java多线程编程 纯手写实现SpringIOC实现过程 JEE企业级开发(企业级项目开发权威指南) 网络爬虫之JAVA正则表达式 手写springMVC框架 老...
Java核心技术:I/O、多线程、网络编程、反射、泛型等 Java虚拟机:内存模型、垃圾收集器、类加载机制等 Java企业级开发:Spring、Hibernate、MyBatis等框架原理 数据库和缓存:SQL优化、索引、Redis、Memcached等 分布式...
C#基础(oop,IO,泛型,反射,多线程和异步,委托和事件,序列化,事务,windows服务,注册表,com,网络编程等) ado.net asp.net asp.net mvc winform(自带控件,自定义控件,dev控件,dotnetbar等) web ...
本书详细介绍用C#语言进行程序开发需要掌握的知识和技术。全书由浅入深分三大部分,...前言和附录分别给出.NET程序员开发职位要求、技能等级、进阶之路,以及面试宝典,可帮助开发者新人快速进阶,找到适合自己的工作。
1.具有扎实的Java基础,对面向对象编程有深刻的理解,熟练掌握java IO流、集合、多线程、反射,泛型,注解,网络编程等基础开发技术; 2.熟练使用常用的java集合类以及常用集合的源码,熟悉多线程以及同步容器以及...
本项目是基于Swing和JDBC开发的图形界面桌面应用,涵盖了J2SE的绝大部分基础知识,通过这个项目能运用和锻炼几乎大部分的J2SE知识和技能。 基础内容: 面向对象 字符串数字 日期 中级内容: 异常 ,集合,JDBC,...
本项目是基于Swing和JDBC开发的图形界面桌面应用,涵盖了J2SE的绝大部分基础知识,通过这个项目能运用和锻炼几乎大部分的J2SE知识和技能。 涉及到如下内容: 基础内容: 面向对象 字符串数字 日期 中级内容: 异常...
本文分为十九个模块,分别是: Java 基础、容器、多线程、反射、对象拷贝、Java Web 、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQ
该资源涵盖了Java的基础知识点,如数据类型、运算符、控制流程等,以及Java的面向对象编程、异常处理、多线程、反射机制、集合框架等高级主题。每个面试题都配有答案与解析,以帮助读者深入理解问题的背景和解决方法...
反射 注解 I/O NIO 多线程和并发 并发编程基础 线程池 锁 并发容器 原子类 JUC并发工具类 网络编程 新特性 JVM 类加载机制 字节码执行机制 JVM内存模型 GC垃圾回收 JVM性能监控与故障定位 JVM调优 二、数据结构和...
在W3Schools里测试你的XML技能! 开始XML测验! -------------------------------------------------------------------------------- 目录表格 XML 基础 XML初步介绍 什么是XML, XML和HTML有什么不同? ...
计算机辅助图形设计II 大纲号:05224805 学分:2 学时:32 执笔人: 审订人: 课程性质:学科基础课 一、课程的地位与作用 本课程是一门专业基础技能课程,利用计算机辅助造型的方法为从事艺术设计专业的 学生在运用...
具有自动HP,BAB,技能等级,基础毅力,基础反射和基础意志计算的多个类别。 主动总计,可以添加任何统计修改器作为奖励。 通过自动的关卡里程碑跟踪来跟踪体验点和提升速度。 以及记录何时添加了多少经验的日志。...
JavaSE3 ------ :后续理解框架的基础,包括反射机制,注解。 JavaUse ------ :开发中常用的工具包,包括Log4j,测试Junit等。 网站------:前端内容,包括前端基础内容和流行框架。 JavaEE ------ :JavaEE...
全方位详细深入阐述从入门到高级Java程序员必备的知识技能。按照现有计划,主要研究如下方面知识点: Java SE重难点、包含但不限于集合、多线程、泛型、反射、I/O; Java Web重难点,包含但不限于Servlet、JSP、...