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语言的反射机制 ...
随机推荐
- 关于js内部运行机制的一本好书
读<单页Web应用一书>,第二章讲了js内部运行机制,感觉棒极了.之前读<你不知道的js>,看的云里雾里,似懂非懂.没想到单页Web一书将此内容讲的如此通俗易懂,好多困惑已久的 ...
- CentOS Linux系统下安装Redis过程和配置参数说明
转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/102.html?1455869303 安装过程: 代码如下: wget h ...
- 品味FastDFS~第三回 项目中的FastDFS
回到目录 包括京东,淘宝在内的几个互联网老大,在实现分布式文件存储这块都使用了FastDFS,它是一个轻量级的东西,安装与使用都很方便,服务器间通过socket进行数据通讯,无论在安全和效率上都是可以 ...
- WebClient.DownloadFile(线程机制,异步下载文件)
线程机制(避免卡屏),异步下载文件. 我做网站的监控,WebClient.DownloadFile这个方法是我经常用到的,必要的时候肯定是要从网上下载些什么(WebRequest 也可以下载网络文件, ...
- SSH无密码登录
首先生成密钥对 ssh-keygen -t rsa cd ~/.ssh/ cat id_rsa.pub 复制你生成的公钥 登录到需要免登录的服务器 cd ~/.ssh 添加到 authorized_k ...
- XML序列化的时候如何支持Namespace
我曾经不止一次(当然不仅仅是我意识到这个问题)说到过,XML标准中的Namespace的设计其实是一个较为失败的设计,它有它的优点,但缺点更多. http://zzk.cnblogs.com/s?w= ...
- backbone库学习-Collection
backbone库的结构: http://www.cnblogs.com/nuysoft/archive/2012/03/19/2404274.html 本文所有例子来自于http://blog.cs ...
- shell脚本学习心得
近来主要捣鼓ubuntu,大多数项目中都用到了sh脚本作为启动脚本等,以前只是大概明白如何使用,今天需要自己修改并运行脚本就碰到了很多问题,所以决定静下心来学习一下shell脚本,学习了几个小时,现将 ...
- NSIS安装与向导生成代码
NSIS 的脚本语言和通常的编程语言有类似的结构和语法,但它是为安装程序这类应用所设计的.NSIS (Nullsoft Scriptable Install System) 是一个专业开源的制作 wi ...
- 如何用UE(UltraEdit)删除重复行?--转
原文地址:https://www.zhengjie.com/question/bb148773 使用UE(UltraEdit)的高级排序功能就可以删除掉所有的重复行. 操作步骤 1.文件—排序(R)— ...