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自带的反射机制可以很方便的达到这种目的,同 ...
随机推荐
- 廖雪峰js教程笔记3
JavaScript的函数在查找变量时从自身函数定义开始,从"内"向"外"查找.如果内部函数定义了与外部函数重名的变量,则内部函数的变量将"屏蔽&qu ...
- loopback 01
关于loopback的相关blog 安装: 官网 $ mkdir office-supplies $ cd office-supplies $ slc loopback $ slc loopback: ...
- C++11 std::chrono库详解
所谓的详解只不过是参考www.cplusplus.com的说明整理了一下,因为没发现别人有详细讲解. chrono是一个time library, 源于boost,现在已经是C++标准.话说今年似乎又 ...
- BZOJ 2002 [Hnoi2010]Bounce 弹飞绵羊 ——Link-Cut Tree
[题目分析] 以前用分块的方法做过这道题目,现在再用LCT水一边,发现思路确实巧妙. 每次弹射,可以看作在一条边上走了过去,而且很重要的性质,每一个点的出边只有一条. 那么就很容易知道,可以用LCT维 ...
- 我的c++学习(4) C++输入输出格式的控制
默认进制:默认状态下,数据按十进制输入输出.如果要求按八进制或十六进制输入输出,在cin或cout中必须指明相应的数据形式,oct为八进制,hex为十六进制,dec为十进制. #include &qu ...
- 后缀数组 POJ 3974 Palindrome && URAL 1297 Palindrome
题目链接 题意:求给定的字符串的最长回文子串 分析:做法是构造一个新的字符串是原字符串+反转后的原字符串(这样方便求两边回文的后缀的最长前缀),即newS = S + '$' + revS,枚举回文串 ...
- STL UVA 11991 Easy Problem from Rujia Liu?
题目传送门 题意:训练指南P187 分析:用vector存id下标,可以用map,也可以离散化用数组存(发现不用离散化也可以) map #include <bits/stdc++.h> u ...
- Java 语言细节
1. if(x = 1) 为什么java不会因为这样的笔误代码犯错? // meant x == 1 因为在C++中,整数0代表布尔值false,非0值相当于布尔值true,在Java中int与布 ...
- Post请求
写在前面的话: XMLHttpRequest对象的open方法的第一个参数为request-type,取值可以为get或post.本篇介绍post请求. 使用post方式时,浏览器会把各表单中字段元素 ...
- POJ 1222 (开关问题+高斯消元法)
题目链接: http://poj.org/problem?id=1222 题目大意:一堆开关,或开或关.每个开关按下后,周围4个方向开关反转.问使最后所有开关都关闭的,开关按法.0表示不按,1表示按. ...