java中的反射
1、何为java反射机制:
在运行过程中,对于任意一个类都能够知道这个类的属性和方法;对于任意一个对象都能调用其属性和方法;这种动态获取信息和动态调用方法 就称为java反射
2、获取Class对象的3种方法
(1).通过Object类的getClass()方法。例如:
Class c1 = new String("").getClass();
(2).通过Class类的静态方法——forName()来实现:
Class c2 = Class.forName("MyObject");
(3).如果T是一个已定义的类型的话,在java中,它的.class文件名:T.class就代表了与其匹配的Class对象,例如:
Class c3 = Manager.class;
Class c4 = int.class;
Class c5 = Double[].class;//基于java当中一切皆对象的特征
3、Class类中的 几种重要的方法
1.getName()
一个Class对象描述了一个特定类的特定属性,而这个方法就是返回String形式的该类的简要描述。由于历史原因,对数组的Class对象
调用该方法会产生奇怪的结果。
2.newInstance()
该方法可以根据某个Class对象产生其对应类的实例。需要强调的是,它调用的是此类的默认构造方法。例如:
MyObject x = new MyObject();
MyObject y = x.getClass().newInstance();
4.getComponentType()
该方法针对数组对象的Class对象,可以得到该数组的组成元素所对应对象的Class对象。例如:
int[] ints = new int[]{1,2,3};
Class class1 = ints.getClass();
Class class2 = class1.getComponentType();
而这里得到的class2对象所对应的就应该是int这个基本类型的Class对象
5.isArray()
判定此Class对象所对应的是否是一个数组对象。
6.Field getField(String name)//返回一个field对象,它返回class对象所表示类或接口的 指定公共成员字段,name参数是一个String
用于指定所需字段的简称
package com.yiibai;
import java.lang.reflect.*;
public class ClassDemo {
public static void main(String[] args) {
ClassDemo c = new ClassDemo();
Class cls = c.getClass();
System.out.println("Field =");
try {
// string field
Field sField = cls.getField("string1");
System.out.println("Public field found: " + sField.toString());
}
catch(NoSuchFieldException e) {
System.out.println(e.toString());
}
}
public ClassDemo() {
// no argument constructor
}
public ClassDemo(String string1) {
this.string1 = string1;
}
public String string1 = "yiibai";
}
7.Field[] getFields()//不带参数,返回的是一个Field类型的数组
8.getMethods
9.getSuperclass();//取得其他类的父类
class hello{ public static void main(String[] args) { Class<?> demo=null; try{ demo=Class.forName("Reflect.Person"); }catch (Exception e) { e.printStackTrace(); } //取得父类 Class<?> temp=demo.getSuperclass(); System.out.println("继承的父类为: "+temp.getName()); }}10.Constructor[] getConstructor()//无参构造器返回的是构造器的数组
public class Student implements Comparable{
public String name;
public int age;
public Student(){
}
public Student(String name){
this.name = name;
}
public Student(int age){
this.age = age;
}
public Student(String name,int age){
this.name=name;
this.age=age;
}
@Override
public String toString() {
return "Student [age=" + age + ", name=" + name + "]";
}
}
//测试
public static void constructTest(){
Constructor[] c = null;
Constructor c2 = null;
Student st1 = null;
Student st2 = null;
Student st3= null;
Student st4= null;
try{
//获取所有构造器数组的方法getConstructors()
c = Class.forName("Student").getConstructors();//获得构造器
st1 = (Student)c[0].newInstance("11");//通过构造器获得实例,不管参数是基本类型还是引用类型
st2 = (Student)c[1].newInstance(12);
st3 = (Student)c[2].newInstance("aa",2);
st4 = (Student)c[3].newInstance();
}catch(Exception e){
e.printStackTrace();
}
System.out.println(st1);
System.out.println(st2);
System.out.println(st3);
System.out.println(st4);
}
//运行结果:
Student [age=0, name=2222]
Student [age=0, name=11]
Student [age=12, name=null]
Student [age=2, name=aa]
Student [age=0, name=null]
11.Constructor getConstructor(Class parameterType)//参数是一个参数类型的Class,比如String.class;
举例(部分截图):
//实例1调用String(StringBuilder str)构造器
String str = "ssseeee";
Constructor cc = (str.getClass()).getConstructor(class[] {StringBuilder.class});//通过传入的参数获取构造器,在实例化
String str1 = (String)cc.newInstance(new StringBuilder("111"));//参照api,正确的写法应该是(new StringBuilder[] {new StringBuilder("111")});不过上面的写法也通过,下面也是
System.out.println(str1);
//实例2 Student(String str)构造器
c2 = (Class.forName("Student")).getConstructor(class[] {String.class});
Student sss = (Student)c2.newInstance(new String("2222"));//通过构造器获取实例,参数是根据木匾对象决定
System.out.println(sss);
添加一个新的链接:http://blog.csdn.net/liujiahan629629/article/details/18013523
java中的反射的更多相关文章
- Java中的反射和注解
前言 在Java中,反射机制和注解机制一直是一个很重要的概念,那么他们其中的原理是怎么样呢,我们不仅仅需要会使用,更要知其然而之所以然. 目录 反射机制 反射如何使用 注解定义 注解机制原理 注解如何 ...
- java中的反射机制在Android开发中的用处
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反 ...
- 浅说Java中的反射机制(二)
写过一篇Java中的反射机制,不算是写,应该是抄了,因为那是别人写的,这一篇也是别人写的,摘抄如下: 引自于Java基础--反射机制的知识点梳理,作者醉眼识朦胧.(()为我手记) 什么是反射? 正常编 ...
- 浅说Java中的反射机制(一)
在学习传智播客李勇老师的JDBC系列时,会出现反射的概念,由于又是第一次见,不免感到陌生.所以再次在博客园找到一篇文章,先记录如下: 引用自java中的反射机制,作者bingoideas.(()为我手 ...
- java中动态反射
java中动态反射能达到的效果和python的语法糖很像,能够截获方法的实现,在真实方法调用之前和之后进行修改,甚至能够用自己的实现进行特别的替代,也可以用其实现面向切片的部分功能.动态代理可以方便实 ...
- 第89节:Java中的反射技术
第89节:Java中的反射技术 反射技术是动态的获取指定的类,和动态的调用类中的内容(没有类前就可以创建对象,将对象的动作完成,这就是动态的获取指定的类). 配置文件把具体实现的类名称定义到配置文件中 ...
- java笔记十:java中的反射
Java中,反射是一种强大的工具.它使您能够创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代表链接.反射允许我们在编写与执行时,使我们的程序代码能够接入装载到JVM中的类的内部信息,而 ...
- 【Java基础】java中的反射机制与动态代理
一.java中的反射机制 java反射的官方定义:在运行状态下,可以获取任意一个类的所有属性和方法,并且可通过某类任意一对象实例调用该类的所有方法.这种动态获取类的信息及动态调用类中方法的功能称为ja ...
- java中使用反射获取pojo(实体)类的全部字段值
说起反射.不得不说它实在是太强大了,通过反射就能够轻轻松松拿到各种东东,假设你想在项目中解除对某个类的依赖,能够考虑用反射. 今天跟大家分享的是通过java中的反射,获取pojo类的全部字段值. 为什 ...
- java 中利用反射机制获取和设置实体类的属性值
摘要: 在java编程中,我们经常不知道传入自己方法中的实体类中到底有哪些方法,或者,我们需要根据用户传入的不同的属性来给对象设置不同的属性值,那么,java自带的反射机制可以很方便的达到这种目的,同 ...
随机推荐
- psql-01基本介绍
安装与启动 安装: apt-get install postgresql / yum install postgresql.XXX; 启动: mac下直接打开 linux service postgr ...
- js 的一点用法
js 中的json对象,ajax返回数据dataType为json否则无法将数据转换成json对象 也就无法通过json字符串转换成对象object,那么他将始终是个字符串,也就无法进行 对象操作. ...
- jquery笔记(遍历)
祖先: $("selector").parent().css():返回被选元素的直接父元素,并调用css方法. $("selector").parents(). ...
- const int *
5.Please choose the right statement about constusage: A.const int a;//const interger B.int const a;/ ...
- Android一体式(沉浸式)状态栏的实现
注:公司开发任务适配是在4.4版本之上进行,所以此适配仅在4.4之上进行测试. 1.主要使用了第三方的开源项目SystemBarTint,github:https://github.com/jgilf ...
- BZOJ4383 : [POI2015]Pustynia
设$a$到$b$的边权为$c$的有向边的含义为$b\geq a+c$,则可以根据题意构造出一张有向图. 设$f[x]$为$x$点可行的最小值,$a[x]$为$x$位置已知的值,则$f[x]=\max( ...
- centos 编译 安装 protobuf
link:http://dbua.iteye.com/blog/1633079 yum -y install gcc+ gcc-c++ yum -y install make 下载protobuf-2 ...
- UVa 11922 & splay的合并与分裂
题意: 1个1—n的排列,实现一下操作:将a—b翻转并移动至序列的最后. SOL: splay维护区间的裸题——不过平衡树的题目貌似都是裸的吧...就是看操作的复杂程度罢... 如何取区间呢,我们在s ...
- 转:js-sdk探索之微信网页分享
原文地址 微信是一个很不错的传播平台,最近公司需要做一个新年贺卡,使用html5制作一个很小的动画,然后发送给客户,不需要和后台有任何的联系,一个很简单的功能,需要利用微信的分享功能,毕竟微信分享的带 ...
- 【BZOJ】1124: [POI2008]枪战Maf
题意 \(n(n < 1000000)\)个人,每个人\(i\)指向一个人\(p_i\),如果轮到\(i\)了且他没死,则他会将\(p_i\)打死.求一种顺序,问死的人最少和最多的数目. 分析 ...