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自带的反射机制可以很方便的达到这种目的,同 ...
随机推荐
- 图解LoadAverage(负载)
图解LoadAverage(负载) http://www.habadog.com/2015/02/27/what-is-load-average/ 一.什么是Load Average 系统负载(S ...
- 浅谈C++多态性
本文转载至http://blog.csdn.net/hackbuteer1/article/details/7475622 总结: (1)区分概念: 重载----同一个类中,相同的函数名字,不同 ...
- SU Demo之01MakingData--02MultiShot
- 关于DOM
前言 DOM的作用是将网页转为一个javascript对象,从而可以使用javascript对网页进行各种操作(比如增删内容).浏览器会根据DOM模型,将HTML文档解析成一系列的节点,再由这些节点组 ...
- linux系统下本地搭建git服务器
linux系统下如何搭建本地git服务器,用于存放团队的开发代码,如下步骤: 1.先用一台服务器来安装git,安装好linux以后,在这里选用的是Ubuntu 14.04.然后配置静态IP:172.1 ...
- LSM树由来、设计思想以及应用到HBase的索引
讲LSM树之前,需要提下三种基本的存储引擎,这样才能清楚LSM树的由来: 哈希存储引擎 是哈希表的持久化实现,支持增.删.改以及随机读取操作,但不支持顺序扫描,对应的存储系统为key-value存储 ...
- Codeforces 660C Hard Process(尺取法)
题目大概说给一个由01组成的序列,要求最多把k个0改成1使得连续的1的个数最多,输出一种方案. 和CF 676C相似. #include<cstdio> #include<algor ...
- How to retrieve instance parameters from an uninstantiated (uninserted) family
The trick to be able to read the default values for instance parameters is to get to the FamilyManag ...
- ORACLE使用EXPDP和IMPDP数据泵进行导出导入的方法
ORACLE使用EXPDP和IMPDP数据泵进行导出导入的方法 (2010-05-28 12:54:34) http://blog.sina.com.cn/s/blog_67d41beb0100ixn ...
- BZOJ3591: 最长上升子序列
因为是一个排列,所以可以用$n$位二进制数来表示$O(n\log n)$求LIS时的单调栈. 首先通过$O(n^22^n)$的预处理,求出每种LIS状态后面新加一个数之后的状态. 设$f[i][j]$ ...