`
风车车
  • 浏览: 1022 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

基础技能之反射

 
阅读更多
  • 定义        
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();
}

 

 

  •  常用的反射的API
  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修饰无参的构造方法,才可以使用此方法去构造对象。
 
 

 

 

 

 

分享到:
评论

相关推荐

    华为数通基础培训PPT汇总集.rar

    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基础、多线程、同步机制、JAVA虚拟机、GC、异常、反射、SPRING事务原理、MYSQL存储引擎及原理、REDIS、EHCACHE、MYCAT、KAFKA、MQ等

    Java核心技术 第12版 开发基础+高级特性 英文原版

    着力让读者在充分理解Java语言和Java类库的基础上,灵活应用Java提供的高级特性,具体包括面向对象程序设计、反射与代理、接口与内部类、异常处理、泛型程序设计、集合框架、事件监听器模型、图形用户界面设计和并发...

    java技能总结.docx

    掌握Java语法和基础:掌握Java的语言特性、数据类型、运算符、控制结构、面向对象编程等基础知识点。 掌握Java标准库:掌握Java标准库中的重要类和接口,如String、ArrayList、HashMap、Thread、Socket等。 掌握Java...

    JAVA高并发高性能高可用高扩展架构视频教程

    企业架构师必备技能(JAVA核心技术反射) JavaWeb之基础(手写实现Tomcat服务器) java多线程编程 纯手写实现SpringIOC实现过程 JEE企业级开发(企业级项目开发权威指南) 网络爬虫之JAVA正则表达式 手写springMVC框架 老...

    涵盖了 Java 基础、集合、源码、并发、虚拟机、框架、数据库、网络编程、设计模式、新特性和数据结构等多个知识领域的面试突击

    Java核心技术:I/O、多线程、网络编程、反射、泛型等 Java虚拟机:内存模型、垃圾收集器、类加载机制等 Java企业级开发:Spring、Hibernate、MyBatis等框架原理 数据库和缓存:SQL优化、索引、Redis、Memcached等 分布式...

    .net技能表.txt

    C#基础(oop,IO,泛型,反射,多线程和异步,委托和事件,序列化,事务,windows服务,注册表,com,网络编程等) ado.net asp.net asp.net mvc winform(自带控件,自定义控件,dev控件,dotnetbar等) web ...

    C#从现象到本质,随书源码。

    本书详细介绍用C#语言进行程序开发需要掌握的知识和技术。全书由浅入深分三大部分,...前言和附录分别给出.NET程序员开发职位要求、技能等级、进阶之路,以及面试宝典,可帮助开发者新人快速进阶,找到适合自己的工作。

    Java高级工程师简历模板18k+

    1.具有扎实的Java基础,对面向对象编程有深刻的理解,熟练掌握java IO流、集合、多线程、反射,泛型,注解,网络编程等基础开发技术; 2.熟练使用常用的java集合类以及常用集合的源码,熟悉多线程以及同步容器以及...

    一本糊涂账-基于Swing和JDBC开发的图形界面桌面应用

    本项目是基于Swing和JDBC开发的图形界面桌面应用,涵盖了J2SE的绝大部分基础知识,通过这个项目能运用和锻炼几乎大部分的J2SE知识和技能。 基础内容: 面向对象 字符串数字 日期 中级内容: 异常 ,集合,JDBC,...

    how2j一本糊涂账项目

    本项目是基于Swing和JDBC开发的图形界面桌面应用,涵盖了J2SE的绝大部分基础知识,通过这个项目能运用和锻炼几乎大部分的J2SE知识和技能。 涉及到如下内容: 基础内容: 面向对象 字符串数字 日期 中级内容: 异常...

    2020年最新版--Java+最常见的+200++面试题汇总+答案总结汇总

    本文分为十九个模块,分别是: Java 基础、容器、多线程、反射、对象拷贝、Java Web 、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQ

    java面试题参考及解答

    该资源涵盖了Java的基础知识点,如数据类型、运算符、控制流程等,以及Java的面向对象编程、异常处理、多线程、反射机制、集合框架等高级主题。每个面试题都配有答案与解析,以帮助读者深入理解问题的背景和解决方法...

    java8集合源码分析-The-Road-To-Bald-Man:Java技能加点,秃顶之路

    反射 注解 I/O NIO 多线程和并发 并发编程基础 线程池 锁 并发容器 原子类 JUC并发工具类 网络编程 新特性 JVM 类加载机制 字节码执行机制 JVM内存模型 GC垃圾回收 JVM性能监控与故障定位 JVM调优 二、数据结构和...

    XML官方指南中文版(CHM) 下载

    在W3Schools里测试你的XML技能! 开始XML测验! -------------------------------------------------------------------------------- 目录表格 XML 基础 XML初步介绍 什么是XML, XML和HTML有什么不同? ...

    计算机辅助图形设计.doc

    计算机辅助图形设计II 大纲号:05224805 学分:2 学时:32 执笔人: 审订人: 课程性质:学科基础课 一、课程的地位与作用 本课程是一门专业基础技能课程,利用计算机辅助造型的方法为从事艺术设计专业的 学生在运用...

    awesomeSheet:在线探路者字符表

    具有自动HP,BAB,技能等级,基础毅力,基础反射和基础意志计算的多个类别。 主动总计,可以添加任何统计修改器作为奖励。 通过自动的关卡里程碑跟踪来跟踪体验点和提升速度。 以及记录何时添加了多少经验的日志。...

    LearnHow2J:练习How2J的代码

    JavaSE3 ------ :后续理解框架的基础,包括反射机制,注解。 JavaUse ------ :开发中常用的工具包,包括Log4j,测试Junit等。 网站------:前端内容,包括前端基础内容和流行框架。 JavaEE ------ :JavaEE...

    Java-Interview-Tutorial:建议star持续更新ing!!!BAT华为工程师四年磨一剑精心编排【Java高级工程师及架构师技能&面试宝典】:数据库、缓存、大数据、机器学习、设计模式、Docker、K8s、RPC、分布式微服务架构相关框架中间件原理及电商互联网下的业务实践

    全方位详细深入阐述从入门到高级Java程序员必备的知识技能。按照现有计划,主要研究如下方面知识点: Java SE重难点、包含但不限于集合、多线程、泛型、反射、I/O; Java Web重难点,包含但不限于Servlet、JSP、...

Global site tag (gtag.js) - Google Analytics