Java总结篇系列:Java 反射
Java反射:
- package com.corn;
- import java.lang.reflect.Constructor;
- import java.lang.reflect.Field;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- public class TestReflect {
- public static void main(String[] args) {
- // 获取“类类型对象” 方法1
- Class<?> c0 = User.class;
- // 获取“类类型对象” 方法2
- User user1 = new User();
- Class<?> c1 = user1.getClass();
- User user2 = new User();
- Class<?> c2 = user2.getClass();
- System.out.println("user class instance 0:" + c0); //user class instance 0:class com.corn.User
- System.out.println("user class instance 1:" + c1); //user class instance 1:class com.corn.User
- System.out.println("user class instance 2:" + c2); //user class instance 2:class com.corn.User
- //c0 == c1 :true, c1 == c2 :true
- System.out.println("c0 == c1 :" + (c0 == c1) + ", c1 == c2 :" + (c1 == c2));
- try {
- // 获取“类类型对象” 方法3
- Class<?> c3 = Class.forName("com.corn.User");
- System.out.println("user class c3:" + c3); //user class c3:class com.corn.User
- try {
- User user3 = (User) c3.newInstance();
- //Constructor public com.corn.User(int,java.lang.String,int)
- //Constructor public com.corn.User(int,java.lang.String)
- //Constructor public com.corn.User()
- Constructor<?>[] cons = c3.getConstructors();
- for (int i = 0; i < cons.length; i++) {
- // 一次返回类定义中所有public修饰符修饰的“构造器对象”,其与类定义中的构造器顺序不一定相同
- System.out.println("Constructor " + cons[i]);
- }
- try {
- User user4 = (User) cons[1].newInstance(51, "corn");
- //user instance 4:user instance uid:51 name:corn
- System.out.println("user instance 4:" + user4);
- // 返回特定参数类型的“构造器对象”所新建的实例
- User user40;
- user40 = (User) c3.getConstructor(int.class, String.class).newInstance(520, "corn0");
- //user instance 40:user instance uid:520 name:corn0
- System.out.println("user instance 40:" + user40);
- // 返回该类“类类型对象”的所有的父类“类类型对象”
- Class<?> father = c3.getSuperclass();
- //father class instance class com.corn.Person
- System.out.println("father class instance " + father);
- //返回类对象所有的接口对象(其实也是类类型对象)数组
- Class<?>[] interfaceArray = c3.getInterfaces();
- //interface class instance 0 interface com.corn.Workable
- //interface class instance 1 interface com.corn.Thinkable
- for (int i = 0; i < interfaceArray.length; i++) {
- // 与implements中接口顺序相同
- System.out.println("interface class instance " + i + " " + interfaceArray[i]);
- }
- } catch (IllegalArgumentException e) {
- e.printStackTrace();
- } catch (InvocationTargetException e) {
- e.printStackTrace();
- }
- } catch (InstantiationException e) {
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- } catch (Exception e) {
- e.printStackTrace();
- }
- // 返回“类类型对象”所具有的全部属性实例/对象
- Field[] fieldArray = c0.getDeclaredFields();
- //filed 0 private int com.corn.User.uid
- //filed 1 private java.lang.String com.corn.User.name
- //filed 2 private int com.corn.User.age
- for (int i = 0; i < fieldArray.length; i++) {
- System.out.println("filed " + i + " " + fieldArray[i]);
- }
- User u = new User(12, "yumidi", 99);
- try {
- // 直接获取private/私有属性的值
- Field nameField = c0.getDeclaredField("name");
- //取消Java对访问修饰符的检查
- nameField.setAccessible(true);
- String nameValue = (String) nameField.get(u);
- //name:yumidi
- System.out.println("name:" + nameValue);
- // 直接改变private/私有属性的值
- nameField.set(u, "corn");
- //new name:corn
- System.out.println("new name:" + u.getName());
- } catch (NoSuchFieldException e) {
- e.printStackTrace();
- } catch (SecurityException e) {
- e.printStackTrace();
- } catch (Exception e) {
- e.printStackTrace();
- }
- //访问私有方法
- try {
- Method method = c0.getDeclaredMethod("getResult");
- //取消Java对访问修饰符的检查
- method.setAccessible(true);
- int result = (int) method.invoke(u);
- //result:1000
- System.out.println("result:" + result);
- } catch (NoSuchMethodException e) {
- e.printStackTrace();
- } catch (SecurityException e) {
- e.printStackTrace();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- class User extends Person implements Workable, Thinkable {
- private int uid;
- private String name;
- private int age;
- public User() {
- }
- private User(int uid) {
- this.uid = uid;
- }
- protected User(String name) {
- this.name = name;
- }
- public User(int uid, String name) {
- this.uid = uid;
- this.name = name;
- }
- public User(int uid, String name, int age) {
- this.uid = uid;
- this.name = name;
- this.age = age;
- }
- public int getUid() {
- return uid;
- }
- public void setUid(int uid) {
- this.uid = uid;
- }
- 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;
- }
- private int getResult() {
- return 1000;
- }
- @Override
- public String toString() {
- return "user instance uid:" + this.uid + " name:" + this.name;
- }
- }
- class Person {
- }
- interface Workable {
- }
- interface Thinkable {
- }
Java总结篇系列:Java 反射的更多相关文章
- Java总结篇系列:Java String
String作为Java中最常用的引用类型,相对来说基本上都比较熟悉,无论在平时的编码过程中还是在笔试面试中,String都很受到青睐,然而,在使用String过程中,又有较多需要注意的细节之处. 1 ...
- Java总结篇系列:Java多线程(三)
本文主要接着前面多线程的两篇文章总结Java多线程中的线程安全问题. 一.一个典型的Java线程安全例子 public class ThreadTest { public static void ma ...
- Java总结篇系列:Java多线程(二)
本文承接上一篇文章<Java总结篇系列:Java多线程(一)>. 四.Java多线程的阻塞状态与线程控制 上文已经提到Java阻塞的几种具体类型.下面分别看下引起Java线程阻塞的主要方法 ...
- Java总结篇:Java多线程
Java总结篇系列:Java多线程 多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的. 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: ...
- java提高篇-----理解java的三大特性之封装
在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...
- Java总结篇系列:java.lang.Object
从本篇开始,将对Java中各知识点进行一次具体总结,以便对以往的Java知识进行一次回顾,同时在总结的过程中加深对Java的理解. Java作为一个庞大的知识体系,涉及到的知识点繁多,本文将从Java ...
- Java总结篇系列:Java多线程(四)
ThreadLocal是什么 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地 ...
- Java面试题系列 ----- Java基础面试题(91道)
更多详情点击查看,点这里!这里!!这里!!! 文末获取所有面试PDF文档! Java概述 1. 何为编程 编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程. 为了 ...
- Java内功修炼系列一反射
“JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制 ...
随机推荐
- 推荐windows下的日志跟踪工具:SnakeTail
用过Linux的同学都知道,在Linux中要实时跟踪日志文件那是非常的方便,Tail.Less都可以做到. 开启动态跟踪后,程序会监视文件修改,从而不断刷新出最新的内容,对于线上运维特别有用. 今 ...
- 从点击Button到弹出一个MessageBox, 背后发生了什么
思考一个最简单的程序行为:我们的Dialog上有一个Button, 当用户用鼠标点击这个Button时, 我们弹出一个MessageBox. 这个看似简单的行为, 谁能说清楚它是如何运行起来的,背后究 ...
- [ZigBee] 13、ZigBee基础阶段性回顾与加深理解——用定时器1产生PWM来控制LED亮度(七色灯)
引言:PWM对于很多软件工程师可能又熟悉又陌生,以PWM调节LED亮度为例,其本质是在每个周期都偷工减料一些,整体表现出LED欠压亮度不同的效果.像大家看到的七色彩灯其原理也类似,只是用3路PWM分别 ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(九):自定义菜单接口说明
上一篇<Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明>介绍了如何通过通用接口获取AccessToken,有了AccessToken,我们就可以来操作 ...
- EF架构~Cannot attach the file as database
回到目录 Cannot attach the file as database这个异常是在EF的code frist里经常出现的,解决方法很简单,只要重新启动一下V11实例即可. CMD> sq ...
- [JavaWeb]关于DBUtils中QueryRunner的一些解读.
前言:[本文属于原创分享文章, 转载请注明出处, 谢谢.]前面已经有文章说了DBUtils的一些特性, 这里再来详细说下QueryRunner的一些内部实现, 写的有错误的地方还恳请大家指出. Que ...
- SpringSide 部署showcase项目出现 JAX-RS (REST Web Services) 2.0 can not be installed错误!
maven+springmvc错误 JAX-RS (REST Web Services) 2.0 can not be installed 项目problem提示错误 JAX-RS (REST Web ...
- Design2:数据层次结构建模之二
MSSql提供了一个新的数据类型 HierarchyID,用来处理层次结构的数据,这个数据类型是系统内置的CLR数据类型,不需要专门激活 SQL/CLR 功能即可使用.当需要表示各值之间的嵌套关系,并 ...
- java集合框架之Set
Set集合 元素不可以重复,是无序. 方法与list相同 HashSet:不保证set的迭代顺序,不同步,内部数据结构是哈希表 如果存自定义对象则需要覆盖equals和hashCode方法 先比较ha ...
- 编译原理:正规式转变成DFA算法
//将正规式转变成NFApackage hjzgg.formal_ceremony_to_dfa; import java.util.ArrayList; class Edge{ public int ...