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. Qt quick 编程

    greaterThan(QT_MAJOR_VERSION,4):QT += widgets.在Qt 5之前,没有独立的QtWidgets模块,Qt Widgets包含在QtGui模块中. TARGET ...

  2. Only Link: Inheritance — private and protected inheritance in c++

    reading note link: https://isocpp.org/wiki/faq/private-inheritance

  3. PHP+MySQL+Easyui tree菜单从后台加载json数据(一)

    实现功能:从数据库加载出所有的数据库名,相应的数据库加载对应的数据库表名 原理:(首先看一下参考手册的内容) 异步加载Tree tree 支持内置的异步加载模式,用户创建一个空的tree,然后定义一个 ...

  4. Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined)D Dense Subsequence

    传送门:D Dense Subsequence 题意:输入一个m,然后输入一个字符串,从字符串中取出一些字符组成一个串,要求满足:在任意长度为m的区间内都至少有一个字符被取到,找出所有可能性中字典序最 ...

  5. php 开启socket配置

    我在Windows命令行输入命令:C:\wamp\bin\php\php5.2.6\php.exe getXml.php以执行php文件. 出现错误:Fatal error: Call to unde ...

  6. 2016huasacm暑假集训训练四 数论_B

    题目链接:http://acm.hust.edu.cn/vjudge/contest/125308#problem/G 题意:求有多少x(1<=x<=n),使得gcd(x,n)>=m ...

  7. Select Option

    jQuery获取Select元素,并选择的Text和Value: 1. $("#select_id").change(function(){//code...}); //为Sele ...

  8. ps 文字处理篇

    ps文字处理篇 1.对文字镂空处理并且移除到新图像上: 首先创建图层-文字编辑-横排编辑 其次 魔棒工具选择通过颜色来选择选区 右击图层-栅格化图层 删除键将选择的颜色删除留下选区- 复制粘贴到另一个 ...

  9. 开源战棋 SLG 游戏框架设计思考(二)规则系统要考虑的因素

    游戏对象 1. 地块方格 地形:山脉.丘陵.乔木林.灌木林.平原.河流.湖泊.海洋.雪原.沼泽.沙漠.暗礁.滩涂.岛屿等等(需完善) 设施:铁路.公路.桥梁.机场.城市.村庄.岸防炮.要塞.废墟等等( ...

  10. redis批量删除key

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; background-color: #fffff ...