1.反射机制是什么:

(1)反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

(2)理解:JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。

python为何称为动态语言:例:

class person

def _init_ (self, name=None,age=None)

  self.name=name

  self.age=age

p=person("tgz","5")

p.sex=male

这时候就发现问题了,我们定义的类里面没有sex这个属性啊!怎么回事呢? 这就是动态语言的魅力和坑! 这里 实际上就是 动态给实例绑定属性!

2.反射机制的功能:

反射机制主要提供了以下功能:

  • 在运行时判断任意一个对象所属的类;

  • 在运行时构造任意一个类的对象;

  • 在运行时判断任意一个类所具有的成员变量和方法;

  • 在运行时调用任意一个对象的方法;

  • 生成动态代理。

3.反射机制获取类有三种方法:

例:

 package practice1;
import java.lang.Class; public class tgztext {
public static void main(String []args) throws Exception{
Class<?> class1=null;
Class<?> class2=null;
Class<?> class3=null;
class1=Class.forName("practice1.tgztext");
class2=new tgztext().getClass();
class3=tgztext.class;
System.out.println(class1.getName());
System.out.println(class2.getName());
System.out.println(class3.getName());
}
}

4.获取一个对象的父类与实现接口

getSuperclass() getInterfaces()

package practice1;

import java.lang.Integer;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.Class;
import java.lang.reflect.Modifier;
import java.lang.reflect.Constructor;
public class tgztext {
public static void main(String []args) throws Exception{
Class <?> clazz=Class.forName("practice1.tgztext");
Class<?>parentClass=clazz.getSuperclass();
System.out.println("clazz的父类为:"+parentClass.getName());
Class <?>interfaces[]=clazz.getInterfaces();
for(int i=0;i<interfaces.length;i++)
{
System.out.println(interfaces[i].getName());
}
}
}

5.通过反射机制实例化一个类的对象

//第一种方法,实例化默认构造方法,调用set赋值        
Class <?> clazz=null;
clazz=Class.forName("practice1.user");
System.out.println(clazz.getName());
user user1=(user) clazz.newInstance();
user1.setAge(10);
user1.setName("qwe");
System.out.println(user1);
user user4=new user(10,"pdd");
System.out.println(user4);
//第二种方法 取得全部构造函数 用构造函数赋值
Constructor<?> cons[]=clazz.getConstructors();
for(int i=0;i<cons.length;i++)
{
Class<?> classes[]=cons[i].getParameterTypes();
System.out.print("cons["+i+"](");
for(int j=0;j<classes.length;j++)
{
if(j==classes.length-1)
System.out.print(classes[j].getName());
else
System.out.print(classes[j].getName()+",");
}
System.out.println(")");
}
user user2=(user) cons[1].newInstance("asd");
System.out.println(user2);

6.获取某个类的全部属性

Field[] field = clazz.getDeclaredFields();

取得实现的接口或者父类的属性

Field []fields1=clazz.getFields();

        Class<?>clazz =Class.forName("practice1.tgztext");
//取得本类的全部属性
Field[] fields=clazz.getDeclaredFields();
for(int i=0;i<fields.length;i++)
{
//权限修饰符
int mo=fields[i].getModifiers();
String priv=Modifier.toString(mo);
//属性类型
Class<?>type=fields[i].getType();
System.out.println(priv+" "+type.getName()+" "+fields[i].getName());
} //实现的接口或父类属性
Field []fields1=clazz.getFields();
for(int i=0;i<fields1.length;i++)
{
//权限修饰符
int mo=fields1[i].getModifiers();
String priv=Modifier.toString(mo);
//属性类型
Class<?>type=fields1[i].getType();
System.out.println(priv+" "+type.getName()+" "+fields1[i].getName());
}

7.获取某个类的全部方法

Method[] method=clazz.getMethods();

8.通过反射机制调用某个类的方法

        Class<?>clazz =Class.forName("practice1.tgztext");
Method[] method=clazz.getMethods();
for(int i=0;i<method.length;i++)
{
Class<?>returnType=method[i].getReturnType();
Class<?> param[]=method[i].getParameterTypes();
int temp=method[i].getModifiers();
System.out.print(Modifier.toString(temp)+" ");
System.out.print(returnType.getName()+" ");
System.out.print(method[i].getName());
System.out.print("(");
for(int j=0;j<param.length;j++)
{
System.out.print(param[j].getName()+" "+"args"+j);
if(j<param.length-1)
{
System.out.print(",");
}
}
Class<?>exce[]=method[i].getExceptionTypes();
if(exce.length>0)
{
System.out.print(")throws ");
for(int k=0;k<exce.length;k++)
{
System.out.print(exce[k].getName()+" ");
if(k<exce.length-1)
{
System.out.print(",");
}
}
}
else{
System.out.print(")");}
System.out.println();
}

通过反射机制调用某个类的方法

method=clazz.getMethod("reflect2", int.class,String.class);

method.invoke(clazz.newInstance(), 20,"张三");

public static void main(String []args) throws Exception{
Class<?>clazz=Class.forName("practice1.tgztext");
Method method=clazz.getMethod("reflect1");
method.invoke(clazz.newInstance());
method=clazz.getMethod("reflect2", int.class,String.class);
method.invoke(clazz.newInstance(), ,"张三");
}
public void reflect1()
{
System.out.println("a");
}
public void reflect2(int age,String name)
{
System.out.println(age+name);
}

java 反射机制的更多相关文章

  1. 第28章 java反射机制

    java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...

  2. Java反射机制

    Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射:     静态编译:在编译时确定类型,绑定对象,即通过 ...

  3. java基础知识(十一)java反射机制(上)

    java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...

  4. java基础知识(十一)java反射机制(下)

    1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...

  5. Java反射机制专题

    ·Java Reflection Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方 ...

  6. java反射机制深入详解

    java反射机制深入详解  转自:http://www.cnblogs.com/hxsyl/archive/2013/03/23/2977593.html 一.概念 反射就是把Java的各种成分映射成 ...

  7. Java反射机制DOME

    Java反射机制 public class TestHibernate { @Test public void TestHb(){ try { Class cs = Class.forName(&qu ...

  8. 反射——Java反射机制

    反射概述 什么是反射? ①   反射的概念是由Smith在1982年首次提出的,主要指程序可以访问.检测和修改它本身状态或行为的一种能力. ②   JAVA反射机制是在运行状态中,对应任意一个类,都能 ...

  9. Java反射机制可以动态修改实例中final修饰的成员变量吗?

    问题:Java反射机制可以动态修改实例中final修饰的成员变量吗? 回答是分两种情况的. 1. 当final修饰的成员变量在定义的时候就初始化了值,那么java反射机制就已经不能动态修改它的值了. ...

  10. Java反射机制学习与研究

    Java反射机制:可以获取正在运行时的Java对象. 1.判断运行时对象对象所属的类. 2.判断运行时对象所具有的成员变量和方法. 3.还可以调用到private方法,改变private变量的值. S ...

随机推荐

  1. Scala:映射和元组

    映射是键值对偶的集合.Scala有一个通用的叫法——元组:n个对象的聚集,并不一定要相同的类型. 构造映射 键A -> 值B scala> val scores = Map()//不可变映 ...

  2. java分享第七天-03(递归打印文件目录的树状结构)

    public static void main(String[] args) { File file= new File("e:/list"); printFile(file, 0 ...

  3. ubuntu12.04下root启动wireshark报错解决办法

    在ubuntu11.10以后版本中发现,安装wireshark后用root权限启动,弹出如下错误: Running as user “root” and group “root”. This coul ...

  4. *HDU1251 字典树

    统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submi ...

  5. 《我爱背单词》 Alpha版 发布说明

    ——发布地址(baidu网盘) http://pan.baidu.com/s/15omtB ——简介  <我爱背单词>是一款英语单词记忆和管理辅助软件,旨在帮助广大考生在短期内攻克GRE. ...

  6. easyloader源码

    /** * easyloader - jQuery EasyUI * * Licensed under the GPL: * http://www.gnu.org/licenses/gpl.txt * ...

  7. javascript平时例子⑧(大屏轮播)

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  8. iOS开发之CocoaLumberjack

    Cocoa LumberJack是一个功能强大的NSlog,是通用的Cocoa日志框架之一.它可以提供更高级的log功能,比如记录log至文件或网络,并可根据log的级别(info.debug.war ...

  9. Moneybookers API支付方式开发 步骤

    开发文档: 支付说明手册 步骤: 1.使用商家帐号,登录到www.moneybookers.com,核对商家信息是否正确. 2.在账户-->商家工具(设置) a.API/MQI password ...

  10. Hibernate主键生成策略(转)

    1.自动增长identity 适用于MySQL.DB2.MS SQL  Server,采用数据库生成的主键,用于为long.short.int类型生成唯一标识 使用SQL Server 和 MySQL ...