java反射机制示例详解_java

1.什么是反射?
一个类有多个组成部分,例如:成员变量,方法,构造方法等。
反射就是加载类,并解剖出类的各个组成部分。

2.加载类
java中有一个Class类用于代表某一个类的字节码。
Class类既然代表某个类的字节码,那就要提供加载某个类
字节码的方法:forName().   此方法用于加载某个类的字节码
到内存中,并使用class对象进行封装。
另外2种得到class对象的方式:
类名.class
对象.getClass()

先创建一个简单的Person类

复制代码 代码如下:

public class ReflectDemo { 
public static void main(String args[]) throws Exception 
{  //1. 
 Class clazz = Class.forName("dsa.Person") ; 

//2. 
Class clazz1 = new Person().getClass() ; 

//3. 
Classclazz2=Person.class;
}
}

3.反射构造方法

Person类中:

复制代码 代码如下:

/**
*构造方法
*/
publicPerson(){
System.out.println("null");
}

publicPerson(Stringname){
System.out.println(name);
}

publicPerson(Stringname,intpwd){
System.out.println(name+"+"+pwd);
}

privatePerson(Listlist){
System.out.println("List");
}

测试类中:

复制代码 代码如下:

//反射publicPerson()
@Test
publicvoidtest1()throwsException{
Classclazz=Class.forName("RflectorDemo.Person");
Constructorcr=clazz.getConstructor(null);//获取构造器对象
Personp=(Person)cr.newInstance(null);//通过构造器实例化对象
//System.out.println(p.name);
}

//反射publicPerson(Stringname)
@Test
publicvoidtest2()throwsException{
Classclazz=Class.forName("RflectorDemo.Person");
Constructorcr=clazz.getConstructor(String.class);
Personp=(Person)cr.newInstance("haha");
System.out.println(p.name);
}

//反射publicPerson(Stringname,intpwd)
@Test
publicvoidtest3()throwsException{
Classclazz=Class.forName("RflectorDemo.Person");
Constructorcr=clazz.getConstructor(String.class,int.class);
Personp=(Person)cr.newInstance("haha",1);
//System.out.println(p.name);
}

//反射publicPerson(Listlist)
@Test
publicvoidtest4()throwsException{
Classclazz=Class.forName("RflectorDemo.Person");
Constructorcr=clazz.getDeclaredConstructor(List.class);
cr.setAccessible(true);//暴力破解
Personp=(Person)cr.newInstance(newArrayList());
System.out.println(p.name);
}
//另一种创建对象的途径,只适用于无参的构造方法
@Test
publicvoidtest5()throwsException{
Classclazz=Class.forName("RflectorDemo.Person");

Personp=(Person)clazz.newInstance();
System.out.println(p.name);
}

当构造方法是私有的,我们就进行暴力破解!!!

4.反射常规方法

Person类中:

复制代码 代码如下:

/**
*方法
*/
publicvoidjf()
{

}
publicvoidjf(Stringname,intpwd)
{

}
publicClass[]jf(Stringname,int[]pwd)
{
returnnewClass[]{String.class,int.class};
}
privatevoidjf(InputStreamin)
{
System.out.println(in);
}
publicstaticvoidjf(intnum)
{
System.out.println(num);
}
publicstaticvoidmain(Stringargs[])
{
System.out.println("main!!!");
}

测试类中:

复制代码 代码如下:

/**
*反射类的方法
*
*@authortanlvxu
*
*/
publicclassDemo2{

//反射类的方法:publicvoidjf()
@Test
publicvoidtest1()throwsException{
Personp=newPerson();
Classclazz=Class.forName("RflectorDemo.Person");
Methodmethod=clazz.getMethod("jf",null);
method.invoke(p,null);
}

//反射类的方法:publicvoidjf(Stringname,intpwd)
@Test
publicvoidtest2()throwsException{
Personp=newPerson();
Classclazz=Class.forName("RflectorDemo.Person");
Methodmethod=clazz.getMethod("jf",String.class,int.class);
method.invoke(p,"dsa",30);
}

//反射类的方法:publicClass[]jf(Stringname,int[]pwd)
@Test
publicvoidtest3()throwsException{
Personp=newPerson();
Classclazz=Class.forName("RflectorDemo.Person");
Methodmethod=clazz.getMethod("jf",String.class,int[].class);
Classcs[]=(Class[])method.invoke(p,"aads",newint[]{1,2,3});
System.out.println(cs[0]);
}

//反射类的方法:privatevoidjf(InputStreamin)
@Test
publicvoidtest4()throwsException{
Personp=newPerson();
Classclazz=Class.forName("RflectorDemo.Person");
Methodmethod=clazz.getDeclaredMethod("jf",InputStream.class);
method.setAccessible(true);
method.invoke(p,newFileInputStream("d:\\qqClient.txt"));
}

//反射类的方法:publicstaticvoidjf(intnum)
@Test
publicvoidtest5()throwsException{
Classclazz=Class.forName("RflectorDemo.Person");
Methodmethod=clazz.getMethod("jf",int.class);
method.invoke(null,30);
}

//反射类的方法:publicstaticvoidm(intnum)
@Test
publicvoidtest6()throwsException{
Classclazz=Class.forName("RflectorDemo.Person");
Methodmethod=clazz.getMethod("main",String[].class);
//method.invoke(null,(Object)newString[]{"ds","das"});
method.invoke(null,newObject[]{newString[]{"ds","das"}});
}

5.反射字段

PerSon类中:

复制代码 代码如下:

/**
*字段
*/
publicStringname="swr";
privateintpassword=45;
privatestaticintage=35;
测试类中:

Java代码
/**
*反射类的字段
*@authortanlvxu
*
*/
publicclassDemo3{
/**
*反射字段publicStringname="swr";
*@throwsException
*/
@Test
publicvoidtest1()throwsException
{
Personp=newPerson();
Classclazz=Class.forName("RflectorDemo.Person");
Fieldf=clazz.getField("name");
//获取字段的值
Objectvalue=f.get(p);
//获取字段的类型
Classtype=f.getType();
if(type.equals(String.class)){
Stringname=(String)f.get(p);
System.out.println(name);
}

//设置字段的值
f.set(p,"dfafa");
System.out.println(p.name);

}

/**
*反射字段privateintpassword;
*@throwsException
*/
@Test
publicvoidtest2()throwsException
{
Personp=newPerson();
Classclazz=Class.forName("RflectorDemo.Person");
Fieldf=clazz.getDeclaredField("password");
f.setAccessible(true);
f.set(p,36);
System.out.println(f.get(p));

}

/**
*反射字段privatestaticintage=35;
*@throwsException
*/
@Test
publicvoidtest3()throwsException
{
Classclazz=Class.forName("RflectorDemo.Person");
Fieldf=clazz.getDeclaredField("age");
f.setAccessible(true);
f.set(null,24);
System.out.println(f.get(null));

}

其实无论反射构造方法,或者字段都大致相同,我们可以举一反三!

时间: 2024-10-02 14:52:37

java反射机制示例详解_java的相关文章

Java反射机制深入详解

一.概念 反射就是把Java的各种成分映射成相应的Java类. Class类的构造方法是private,由JVM创建. 反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作.例如它允许一个java的类获取他所有的成员变量和方法并且显示出来.Java 的这一能力在实际应用中也许用得不是很多,但是在其它的程序设计语言中根本就不存在这一特性.例如,Pascal.C 或者 C++ 中就没有办法在程序中获得函数定义相关的信息. (来自Sun) Java

java list用法示例详解_java

|--List:元素是有序的(怎么存的就怎么取出来,顺序不会乱),元素可以重复(角标1上有个3,角标2上也可以有个3)因为该集合体系有索引,  |-- ArrayList:底层的数据结构使用的是数组结构(数组长度是可变的百分之五十延长)(特点是查询很快,但增删较慢)线程不同步  |-- LinkedList:底层的数据结构是链表结构(特点是查询较慢,增删较快)  |-- Vector:底层是数组数据结构 线程同步(数组长度是可变的百分之百延长)(无论查询还是增删都很慢,被ArrayList替代了

java反射机制示例_java

java反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 复制代码 代码如下: package C_20130313; import java.lang.reflect.Method; class User {     private String name;     public User(){}     public User(

Java RandomAccessFile的用法详解_java

RandomAccessFile RandomAccessFile是用来访问那些保存数据记录的文件的,你就可以用seek( )方法来访问记录,并进行读写了.这些记录的大小不必相同:但是其大小和位置必须是可知的.但是该类仅限于操作文件. RandomAccessFile不属于InputStream和OutputStream类系的.实际上,除了实现DataInput和 DataOutput接口之外(DataInputStream和DataOutputStream也实现了这两个接口),它和这两个类系毫

Java反射机制的学习总结_java

一.什么是反射机制 简单的来说,反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息. 二.哪里用到反射机制 有些时候,我们用过一些知识,但是并不知道它的专业术语是什么,在刚刚学jdbc时用过一行代码, Class.forName("com.mysql.jdbc.Driver.class").newInstance();但是那时候只知道那行代码是生成驱动对象实例,并不知道它的具体含义.听了反射机制这节课后,才知道,原来这

java 线程创建多线程详解_java

Java 线程类也是一个 object 类,它的实例都继承自 java.lang.Thread 或其子类. 可以用如下方式用 java 中创建一个线程,执行该线程可以调用该线程的 start()方法: Tread thread = new Thread(); thread.start(); 在上面的例子中,我们并没有为线程编写运行代码,因此调用该方法后线程就终止了. 编写线程运行时执行的代码有两种方式:一种是创建 Thread 子类的一个实例并重写 run 方法,第二种是创建类的时候实现 Run

Java 中ThreadLocal类详解_java

ThreadLocal类,代表一个线程局部变量,通过把数据放在ThreadLocal中,可以让每个线程创建一个该变量的副本.也可以看成是线程同步的另一种方式吧,通过为每个线程创建一个变量的线程本地副本,从而避免并发线程同时读写同一个变量资源时的冲突. 示例如下: import java.util.Random; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import ja

Docker搭建前端Java的开发环境详解_java

一.解决的痛点       1.免搭建后端开发环境.       2.开发环境改变只需要改变镜像就能同步更新.       3.不需要eclipse等IDE工具.       4.切换开发项目 二.解决思路 利用docker启动Ubuntu镜像,在容器中搭建好项目需要的开发环境,使用挂载卷将本地代码挂载到容器中,使用容器中的环境编译运行代码,宿主机通过 docker 暴漏出的端口访问容器中的服务,这样前端的开发机上就只需要部署docker就搞定了. 三.关于docker 了解docker 本文并

java多线程下载实例详解_java

本文实例讲述了java多线程下载.分享给大家供大家参考,具体如下: 使用多线程下载文件可以更快完成文件的下载,多线程下载文件之所以快,是因为其抢占的服务器资源多.如:假设服务器同时最多服务100个用户,在服务器中一条线程对应一个用户,100条线程在计算机中并非并发执行,而是由CPU划分时间片轮流执行,如果A应用使用了99条线程下载文件,那么相当于占用了99个用户的资源,假设一秒内CPU分配给每条线程的平均执行时间是10ms,A应用在服务器中一秒内就得到了990ms的执行时间,而其他应用在一秒内只