java中反射的基本使用
fanShe.java
package example5;
class fanShe{
/*1.应用在一些通用性比较高的代码中。
*2.后面学的框架,大多数都是应用框架来实现的。
*3.在框架开发中,都是基于配置文件来开发。在配置文件中配置了类,可以通过反射得到类中的所有内容,可以让类中的某个方法来执行。
*类中的所有内容:属性,没有参数的构造方法,有参数的构造方法,普通方法。
*反射的原理:
*代码保存在.java文件中保存至本地硬盘-->编译得到.class文件-->把class类使用jvm中的类加载器加载至内存-->Class类(字节码文件在内存中的表示)
*我如果得到了这个Class类,便可以得到类里所有的内容
*使用反射首先需要得到Class类(三种方法)
*(1)类名.class
*(2)对象名.getClass()
*(3)使用Class.forName("类的路径")
*属性通过一个类Field获得。
*构造方法通过一个类constructor获得。
*普通方法通过一个类method获得。
*/
private String name;
int age;
//无参数的构造方法
public fanShe() {}
//有参数的构造方法
public fanShe(String name, int age) {
super();
this.name = name;
this.age = age;
}
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;
}
}
testFanshe.java
package example5;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import org.junit.Test;
class testFanshe {
public static void main(String[] args) throws Exception {
// 得到Class类的三种方法
Class c1 = fanShe.class;
Class c2 = new fanShe().getClass();
Class c3 = Class.forName("example5.fanShe");
/*test1();
test2();
test3();*/
test4();
}
// 反射操作无参数的构造方法
public static void test1() throws Exception {
Class c3 = Class.forName("example5.fanShe");
// 得到反射类的一个实例
fanShe f1 = (fanShe) c3.newInstance();
// 用实例去调用类中的方法
f1.setName("宝娟");
System.out.println(f1.getName());
}
// 反射操作有参数的构造方法
@Test
public static void test2() throws Exception {
// 得到Class类
Class c3 = Class.forName("example5.fanShe");
// 得到有参数的构造方法类
// 传递的是有参数的构造方法里的参数类型,以class类型传递
Constructor con = c3.getConstructor(String.class, int.class);
// 通过有参的构造方法设置实例的值
fanShe p1 = (fanShe) con.newInstance("阿苏", 20);
System.out.println(p1.getName() + " " + p1.getAge());
}
// 反射操作类的属性
public static void test3() {
// 得到Class类
try {
Class c2 = Class.forName("example5.fanShe");
// 得到类的一个实例
fanShe p2 = (fanShe) c2.newInstance();
// 得到name属性,参数是属性名称
Field f1 = c2.getDeclaredField("name");
//表示允许操作私有属性
f1.setAccessible(true);
//为name属性设置值,第一个参数是类的一个实例,第二个参数是要设置的值。
f1.set(p2, "wangwu");
// 得到属性值并打印输出
System.out.println(f1.get(p2));
} catch (Exception e) {
e.printStackTrace();
}
}
//使用反射来操作普通方法
public static void test4() throws Exception {
//得到Class类
Class c4=Class.forName("example5.fanShe");
//得到类的一个实例
fanShe p4=(fanShe) c4.newInstance();
//得到普通方法的类的方法,第一个参数是要操作的普通方法的名称,第二个参数是普通方法中传入参数的类型。
Method f4=c4.getDeclaredMethod("setAge", int.class);
//操作的是私有方法
f4.setAccessible(true);
//此函数是使普通方法运行,并设置值。第一个参数是类的一个实例,第二个参数是要设置的值。
f4.invoke(p4,15);
//将设置的值打印输出
System.out.println(p4.getAge());
}
/*注:当操作的方法是静态方法是,由于静态方法的调用方式是 类名.方法名
* 所以不需要类的实例
* 在invoke()方法中的第一个参数直接写为null
* f4.invoke(null,15);
*/
}
java中反射的基本使用的更多相关文章
- Java中反射的三种常用方式
Java中反射的三种常用方式 package com.xiaohao.test; public class Test{ public static void main(String[] args) t ...
- java中反射学习整理
转载请注明:http://blog.csdn.net/j903829182/article/details/38405735 反射主要是指程序能够訪问.检測和改动它本身的状态或行为的一种能力. jav ...
- Java中反射的实现方式
所谓反射,是指在运行时状态中,获取类中的属性和方法,以及调用其中的方法的一种机制.这种机制的作用在于获取运行时才知道的类(Class)及其中的属性(Field).方法(Method)以及调用其中的方法 ...
- 简单模拟Java中反射的应用场景
有人说Java是一门静态语言.那么何为静态语言,动态语言又是什么? 1.动态语言 是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以 被引进,已有的函数可以被删除或是其他结构上的变化 ...
- Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别
一.Java的反射机制 每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图: 其中
- Java中反射与常用方法
java通常是先有类再有对象,有对象我就可以调用方法或者属性. 反射其实是通过Class对象来调用类里面的方法.通过反射可以调用私有方法和私有属性.大部分框架都是运用反射原理. 如何获得Class ...
- Java中反射机制详解
序言 在学习java基础时,由于学的不扎实,讲的实用性不强,就觉得没用,很多重要的知识就那样一笔带过了,像这个马上要讲的反射机制一样,当时学的时候就忽略了,到后来学习的知识中,很多东西动不动就用反射, ...
- java中反射讲解及实例
Java反射机制详解 java 反射 定义 功能 示例 概要: Java反射机制详解 | |目录 1反射机制是什么 2反射机制能做什么 3反射机制的相关API ·通过一个对象获得完整的包名和类名 ·实 ...
- Java中反射的理解
反射 一.什么是反射 Java 反射是Java语言的一个很重要的特征,它使得Java具体了"动态性". 反射用在 Java 身上指的是我们可以于运行时加载.探知.使用编译期间完全未 ...
- java中反射
Person.java===>>person.class ==>>jvm中的类加载器===>>class对象:代表内存中Person.class ==>> ...
随机推荐
- strcmp和stricmp、strcmpi三者之间的区别(C++)
原文:http://www.cnblogs.com/tankeee/p/3957629.html #include <string.h> #include <stdio.h> ...
- jquery事件绑定函数
1.bind 使用语法: jQueryObject.bind( events [, data ], handler ) jQueryObject.bind( events [, data ] [, i ...
- js 浅拷贝有大用
如题 像浅拷贝.深拷贝这类的知识点我们应该都明白是怎么回事,大部分都是在面试的时候会被问到.大多让你实现一个深拷贝.现实中我们都用比较暴力直接的手段 JSON stringify. 一句话就搞定,管他 ...
- 设计模式:状态(State)模式
设计模式:状态(State)模式 一.前言 状态模式在某些场合中使用是非常方便的,什么叫做状态,如果大家学过<编译原理>就会明白DFA M和NFA M,在确定有限状态机和非确定有限 ...
- Hyperledger Fabric 1.0 学习搭建 (三)--- 运行测试e2e-Fabric
3.1.运行fabric-samples的问题说明 该问题说明能够解决6.1.平台特定使用的二进制文件配置第一步的问题.可以选择继续阅读该说明,或者等参考到6.1小节时再反向阅读本说明,具体在6.1中 ...
- ArcSde服务启动后又停止
问题:突然发现ArcSde服务无法启动,“ArcSde服务启动后又停止,......” 环境:Win7+ArcSDE10 +Oracle11g 由于本人使用ArcSde时间不长,基本没有遇到过什么问题 ...
- 在Windows 10上部署Apache PredictionIO开发环境
Windows在初研究人员的探索下,研究出了一套更为精简的环境配置,极大的缩短了开发时间与效率,在此总结以供后来者参阅. 1.部署环境的配置 Windows10 64 home IntelliJ ID ...
- 分享上传图片shell的绕过过滤的几种方法
一般网站图片上传功能都对文件进行过滤,防止webshell写入.但不同的程序对过滤也不一样,如何突破过滤继续上传? 本文总结了七种方法,可以突破! 1.文件头+GIF89a法.(php)//这个很好理 ...
- Python模块(进阶3)
转载请标明出处: http://www.cnblogs.com/why168888/p/6411917.html 本文出自:[Edwin博客园] Python模块(进阶3) 1. python中模块和 ...
- 关于TCHAR和string对象的c.str()一些注意事项
1.TCHAR 根据预处理器的设置,如果是_MBCS, 那么TCHAR = char: 如果 如果设置的是UNICODE和_UNICODE,那么TCHAR=wchar_t.就等于根据当前环境会选择不同 ...