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自带的反射机制可以很方便的达到这种目的,同 ...
随机推荐
- CSS3_loading效果
写个div给他个基本样式: <body> <div class="load-container load" id="loader" > ...
- Uva 679 Dropping Balls
这道题如果模拟着来写,思路很简单 #include <iostream> #include <cstring> using namespace std; int T,D,I,c ...
- Hash(LCP) || 后缀数组 LA 4513 Stammering Aliens
题目传送门 题意:训练指南P225 分析:二分寻找长度,用hash值来比较长度为L的字串是否相等. #include <bits/stdc++.h> using namespace std ...
- three.js 场景入门
<!DOCTYPE html> <html> <head> <title>Example 01.02 - First Scene</title&g ...
- time元素
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- git冲突解决
http://www.cnblogs.com/sinojelly/archive/2011/08/07/2130172.html http://hi.baidu.com/jqxw4444/item/f ...
- AdaBoost 和 Real Adaboost 总结
AdaBoost 和 Real Adaboost 总结 AdaBoost Real AdaBoost AdaBoost AdaBoost, Adaptive Boosting(自适应增强), 是一种集 ...
- 【转】如果成为一个牛比的BI售前
转自:天善智能 没有最厉害,只有更厉害啊.也没有一定哪儿厉害,会因人定制各有不同啊.打个比方,如果你长得很庄重,年长,光头或布满银丝,然后以专业的态度,以饱满的激情去跟你客户宣讲,杀伤力巨大.所以,卖 ...
- iOS开发代码规范(通用)
1. 关于命名 1> 统一要求 含义清楚,尽量做到不需要注释也能了解其作用,若做不到,就加注释 使用全称,不适用缩写 2> 类的命名 大驼峰式命名:每个单词的首字母都采用大写字母 例子:M ...
- BZOJ3553 : [Shoi2014]三叉神经树
设val[i]为i连出去的树突中输出值为0的个数 如果val[x]<=1,输出值为1,否则输出值为0 修改x就相当于val[f[i]]++或者val[f[i]]-- 用Link-cut Tree ...