java 反射绝大部分都位于 java.lang.reflect package 中;常用的类就是:

1.class类:代表一个类

2.field类:代表类的成员变量

3.method:代表类的方法

4.constructor:代表类的构造方法

5.array:提供动态创建数组,访问数组元素的静态方法
在Java 中无论生成这个类的多少个对象,这个对象都对应同一个class 对象

Class 对象生成的三种方式:

1.使用class类的静态方法。Class.forNanme("packageName"); ---> Class<?> forName =Class.forName("com.project.Test")获取Test类的class 对象;
2.类名.class ;---> Class<?> clazz =Test.class;
3.对象.class();--->Test te =new Test(); te.getClass(); Class<?> clazz = te.getClass();

使用反射进行方法的调用:

1.获取class对象
2.通过getMethod method obtain specific Method 参数传入(1.方法名,2.方法传入的参数class 类型)
3.获取类的实例
4.调用方法的invoke method 。参数传入(1.类的实例,2.具体方法传入的参数)

This is Example

public class Reflect2 {

    public static void main(String[] args) throws Exception {

        //judge memory
Class<?> forName = Class.forName("com.java.baseknowledge.reflect.TheReflect");
System.out.println(forName==TheReflect.class);
// get method ,accept method name and class of param
Method method = forName.getMethod("add", Integer.class,Integer.class);
//instance of object
Object newInstance = forName.newInstance();
//method invoke,accept instance of object and method param
System.out.println(method.invoke(newInstance, 4,5)); } } class TheReflect{ private String name;
private Integer age;
public Integer add(Integer param1,Integer param2) { return param1+param2; } public void sayHello(String param1) { System.out.println("Hello"+param1);
} }

反射通过构造函数的方式进行创建对象的两种方式

1.obtain class object use  generation class object method 

2.通过class对象的.getConstructor(class对象) 方法 obtain specific Constructor

3.通过Constructor 类中的 newInstance(object obj) 方法获取类的实例

而,对于空参数的构造函数对象的创建,我们直接使用
      class对象的.newInstance(),就可以创建一个对象,只适用于构造空的构造函数
please fllow me next example

this is Example

public class ReflectConstructor {

    public static void main(String[] args) throws Exception {

        Class<?> name = Class.forName("com.java.baseknowledge.reflect.TheReflect01");

        //obtain constructor
Constructor<?>[] constructors = name.getConstructors(); for(int i=0;i<constructors.length;i++) { //print all constructors
System.out.println(constructors[i]); } //无参构造函数实例创建,direct class object .newInstance
Object newInstance2 = name.newInstance();
//有参构造函数执行
Constructor<?> constructor = name.getConstructor(String.class,Integer.class); TheReflect01 newInstance = (TheReflect01)constructor.newInstance("cys",56); } } class TheReflect01{ public TheReflect01() {
System.out.println("no param constructor execute");
}
public TheReflect01(String name,Integer age) {
this.name=name;
this.age=age;
System.out.println("有参数构造函数块执行"+name+"...."+age);
}
private String name;
private Integer age;
public Integer add(Integer param1,Integer param2) { return param1+param2; } public void sayHello(String param1) { System.out.println("Hello"+param1);
} }

Java 反射如何调用私有的方法与成员变量呢?

1.class 方法中找到带有declared字样的方法基本上都是可以返回所有的成员变量与方法的,不管是private 还是protect ;
2.设置setAccessible(true) 可以压制Java 对特殊修饰符的检查,我们就可以在反射中调用private 方法; Fllow next Example
package com.java.baseknowledge.reflect;

import java.lang.reflect.Field;
import java.lang.reflect.Method; /**
* invocation private method and private property use reflect
* @author iscys
*
*/
public class InvocationPrivate { public static void main(String[] args) throws Exception { Class<?> forName = Class.forName("com.java.baseknowledge.reflect.primitive01"); //obtain private method
Method declaredMethod = forName.getDeclaredMethod("TestReflect", new Class[] {String.class,String.class}); //instance of object
Object newInstance = forName.newInstance(); //set accessiable,suppress Java language access check,压制Java 语法检查,就可以进行调用private 方法了 declaredMethod.setAccessible(true); //invoke method declaredMethod.invoke(newInstance, "test01","test02"); System.out.println("....private field ");
//invoke private property
Field declaredField = forName.getDeclaredField("name");
declaredField.setAccessible(true);
declaredField.set(newInstance, "iscys");
Object object = declaredField.get(newInstance);
System.out.println(object); } } /**
* defined private method
* @author iscys
*
*/
class primitive01{ private String name; private void TestReflect(String param,String param1) { System.out.println("this invoke private methood start.."+param+".."+param1); } }

java 基础之--反射详解的更多相关文章

  1. Java基础之 数组详解

    前言:Java内功心法之数组详解,看完这篇你向Java大神的路上又迈出了一步(有什么问题或者需要资料可以联系我的扣扣:734999078) 数组概念 同一种类型数据的集合.其实数组就是一个容器. 数组 ...

  2. java基础之:详解内部类(转载)

    可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面 ...

  3. java基础-泛型举例详解

    泛型 泛型是JDK5.0增加的新特性,泛型的本质是参数化类型,即所操作的数据类型被指定为一个参数.这种类型参数可以在类.接口.和方法的创建中,分别被称为泛型类.泛型接口.泛型方法. 一.认识泛型 在没 ...

  4. Java基础知识面试题详解(2019年)

    文章目录 1. 面向对象和面向过程的区别 2. Java 语言有哪些特点? 3. 关于 JVM JDK 和 JRE 最详细通俗的解答 JVM JDK 和 JRE 4. Oracle JDK 和 Ope ...

  5. Java基础(52):ClassCastException详解(转)

    ClassCastException,从字面上看,是类型转换错误,通常是进行强制类型转换时候出的错误.下面对产生ClassCastException异常的原因进行分析,然后给出这种异常的解决方法. 这 ...

  6. java基础(十四)-----详解匿名内部类——Java高级开发必须懂的

    在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意的事项.匿名内部类使用的形参为何要为final. 使用匿名内部类内部类 匿名内部类由于没有名字,所以它的创建方式有点儿奇怪.创建格式如下: n ...

  7. Java基础之数组详解

    数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. Java 语言中提供的数组是用来存储固定大小的同类型元素. 你可以声明一个数组变量,如 numbers[1 ...

  8. java基础篇---枚举详解

    在JDK1.5之前,JAVA可以有两种方式定义新类型:类和接口,对于大部分面向对象编程,有这两种似乎就足够了,但是在一些特殊情况就不合适.例如:想要定义一个Color类,它只能有Red,Green,B ...

  9. Java基础 面向对象的详解

    1.1 万物皆对象 我们是怎么认识世界的? 人类从小就不断的接触到各种各类存在世界上的各种生物,然后通过事物的公共特性,将它们归类,所以以后就不会出现见到猫叫老虎.那么我们在现实生活中,是通过具体的某 ...

随机推荐

  1. OS位数,基本概念,结合iOS

    CPU位数,一般指CPU支持的指令集位数,32位CPU对应32位的指令集,64位的CPU对应64位的指令集,不过为了向下兼容,64位CPU也支持32位的指令集. 操作系统位数,一般指操作系统对应的指令 ...

  2. 模糊查询内存查询java实现

    下面说说看到的工作项目中的代码,是这个样子的,事先查询一次数据库,将查询到的整张表的数据存到内存,以后使用时不再查询数据库,而直接操作内存中的数据,这主要用于数据库中的数据比较稳定,不会轻易改变的情况 ...

  3. Delphi 中的颜色常量及效果图

    颜色名称   颜色效果   Hex HTML clBlack   $000000 #000000 clMaroon   $000080 #800000 clGreen   $008000 #00800 ...

  4. C# 容器重用避免GC 的论证

    var lst = new List<int>(); lst.Capacity = ; var cnt = lst.Count; var cp = lst.Capacity; ; i< ...

  5. mysql 设置多个字段聚合自增

    DROP TEMPORARY TABLE IF EXISTS ttp_firstInvest; CREATE TEMPORARY TABLE ttp_firstInvest ( userid varc ...

  6. Linux磁盘空间不足处理方法

    维护Linux服务器正常使用需要经常删除Linux系统运行产生的系统日志和业务环境产生的debug日志文件.安装包等.本文主要描述如何通过脚本实现清理业务环境产生的 debug日志文件和上传或备份的打 ...

  7. 25. IO流.md

    目录 IO分类: 1.FIle类 1.1目录分隔符 1.2常用方法 2.FileInputStream类 2.1读取文件 3.FileOutputStream类 拷贝文件 4.缓冲流 4.1 Buff ...

  8. thread == 票池

    public class ThreadDemo2 { public static void main(String[] args){ TicketPool tp = new TicketPool(); ...

  9. 学JS的心路历程-Promise(二)

    昨天有说到Promise的创建以及then的用法,今天我们来看错误处理. then onRejected 我们昨天有提到说,then两个函式参数,onFulfilled和onRejected,而onR ...

  10. poj2480-Longge's problem-(欧拉函数)

    Longge is good at mathematics and he likes to think about hard mathematical problems which will be s ...