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. Linux:回收循环创建的多个线程

    上午我说了循环创建多个线程,由于进程与线程是如此的相似,进程我们知道要回收,那么线程也自然要回收啦.我们接着看控制原语: 线程与共享 线程间共享全局变量! [牢记]:线程默认共享数据段.代码段等地址空 ...

  2. AWK 知识库

    awk 极客课程 <AWK 编程语言>1 <AWK 编程语言>2 <AWK程序设计语言>https://github.com/wuzhouhui/awk http: ...

  3. MyBatis基础-1

    1.Mybatis简介 2.Mybatis环境搭建 3.Mybatis的开发方式 一.什么框架 框架其本质是半成品程序,提供相关规范,并且提供大量可重用的组件. 目的:让开发者开发出结构比较良好,可读 ...

  4. LG Optimus L90 [D415] T-Mobile 刷机

    1 先使用[ROOT大师]ROOT手机. 2 执行以下ADB命令. adb shell su //备份 dd /by-name/laf of=/sdcard/laf.img. //清除 dd /by- ...

  5. 24 week 4 安装 docker

    安装docker 出现问题 解决办法https://blog.csdn.net/VOlsenBerg/article/details/70140211 发现链接超时,然后就https://blog.c ...

  6. js判断json对象中是否含有某个属性

    obj.hasOwnProperty("key"); 原地址:https://blog.csdn.net/feicongcong/article/details/53463872

  7. vue组件知识点

    1.组件的定义 const component = { props: { //外部父组件约束子组件的 里面不要修改 可以通过触发事件来修改 active: Boolean, propOne: Stri ...

  8. SPSS-回归分析

    回归分析(一元线性回归分析.多元线性回归分析.非线性回归分析.曲线估计.时间序列的曲线估计.含虚拟自变量的回归分析以及逻辑回归分析) 回归分析中,一般首先绘制自变量和因变量间的散点图,然后通过数据在散 ...

  9. vue路由传参

    console.log( _this.$route.params.id)接收参数 <div class="baoming"><router-link :to=&q ...

  10. Shared Preferences

    [Shared Preferences] 1.SharedPreferences  class. Interface for accessing and modifying preference da ...