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. iframe+form上传文件

    <iframe id="iframe1" name="ifra1" style="display: none"></ifr ...

  2. Delphi中QuotedStr介绍及使用

    delphi 函数给字符串两边加单引号并返回.声明:function QuotedStr(const S: string): string;用函数 QuotedStr把字符串S转换成为用引号括起来的字 ...

  3. Lazarus中Windows单元问题

    在程序中加入Windows 单元后,经常会使一些过程和函数莫名其妙的报错,这是因为Windows单元很多函数,过程 与sysutils 单元重名 ,所以一般要把windows 引用放在 sysutil ...

  4. JS 实现分页打印

    在调用window.print()时,可以实现打印效果,但内容太多时要进行分页打印. 在样式中有规定几个打印的样式 page-break-before和page-break-after CSS属性并不 ...

  5. Hibernate学习笔记3.2(Hibernate组建映射)

    1.组建映射 可以存在一个表里面 Husband.java package com.bjsxt.hibernate; import javax.persistence.Embedded; import ...

  6. hadoop-1(单机模式配置)

    下一次的目标是: 把Hadoop的伪分布式配置出来 1:ssh免密码登陆第一步 2:安装java环境 3:安装hadoop2

  7. Python系列之 __new__ 与 __init__

    很喜欢Python这门语言.在看过语法后学习了Django 这个 Web 开发框架.算是对 Python 有些熟悉了.不过对里面很多东西还是不知道,因为用的少.今天学习了两个魔术方法:__new__ ...

  8. 逻辑回归 logit

    [方法转]http://www.powerxing.com/logistic-regression-in-python/ http://blog.csdn.net/lipengcn/article/d ...

  9. 2018面向对象程序设计(Java)第6周学习指导及要求

    2018面向对象程序设计(Java) 第6周学习指导及要求(2018.9.29-2018.10.8)   学习目标 深入理解程序设计中算法与程序的关系: 深入理解java程序设计中类与对象的关系: 理 ...

  10. destructuring assignment

    [destructuring assignment] The destructuring assignment syntax is a JavaScript expression that makes ...