首页 > 编程语言 >10、java反射机制

10、java反射机制

时间:2022-12-08 10:35:04浏览次数:36  
标签:lang 10 java name 反射 Person Class String


1、  什么是反射机制

正常情况下,我们通过类来创建对象。如果反过来,我们要通过一个对象来找到对应的类,怎么办,这时就要用到反射机制。

 

 

2、  java.lang.Class类

a)        Java中Object是所有类的父类,而Object类是java.lang.Class类的一个实例化对象,所以所有的类都是java.lang.Class类的实例化对象,java.lang.Class类是非常特殊的一个类,它是描述类的类

b)        java.lang.Class类的实例化对象(各个类)描述了各个类本身的整个结构,这也是反射机制的基础

c)        记住,所有类都是java.lang.Class类的对象

获取类名和类对象,如下

import java.util.Properties;

publicclass hello{
publicstaticvoid main(String args[])throws Exception{

Properties ps =new Properties();
//获取类名
System.out.println(ps.getClass().getName());

//类对象的三种获取方式
Class c1 = Class.forName("java.util.Properties");
Class c2 =new Properties().getClass();
Class c3 = Properties.class;
System.out.println(c1.getName());
System.out.println(c2.getName());
System.out.println(c3.getName());
}
}

 

 

3、  java.lang.Class类的使用

a)        Class对象来创建对象

b)        获取类结构,要获取类结构需要引用java.lang.reflect包,包括Constructor构造函数、Method方法、Field属性等

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

class Person{
public String name;
public Person(){}
public Person(String name){this.name = name;}
}

publicclass hello{
publicstaticvoid main(String args[])throws Exception{

//创建Class类的Person类对象
Class c1 = Class.forName("Person");

//使用newInstanctce()方法来实例化Person类,此处调用的是无参构造函数
Person p =(Person)c1.newInstance();
p.name ="kaka";
System.out.println(p.name);

//获取Person类的构造函数列表
Constructor cs[]= c1.getConstructors();
for(Constructor c : cs){
System.out.println(c);
}

//获取Person类的函数列表
Method ms[]= c1.getMethods();
for(Method m : ms){
System.out.println(m);
}
}
}

 

 

4、  通过反射调用类中方法与属性等,invoke()

import java.lang.reflect.Method;
import java.lang.reflect.Field;

class Person{
private String name;
publicint age;
public Person(){}
public String getName(){returnthis.name;}
publicvoid setName(String name){this.name = name;}
}

publicclass hello{
publicstaticvoid main(String args[])throws Exception{

//通过类名获取Person类对象
//注意:使用Class<?>泛型,否则报不安全错误
Class<?> c1 = Class.forName("Person");
//获取Person的实例化对象
Object obj = c1.newInstance();

//获取Person类中的setName方法,该方法带一个String参数
Method m1 = c1.getMethod("setName", String.class);
//调用setName方法,需传入Person实例化对象,和参数
m1.invoke(obj,"kaka");

//获取Person类中的getName方法,该方法不带参数
Method m2 = c1.getMethod("getName");
//输出返回值
System.out.println((String)m2.invoke(obj));

//通过反射操作属性
Field f1 = c1.getDeclaredField("age");
f1.set(obj,100);
System.out.println(f1.get(obj));
}
}

 

 

5、  动态代理,没看懂,需要时再看吧

标签:lang,10,java,name,反射,Person,Class,String
From: https://blog.51cto.com/u_15906220/5920653

相关文章

  • 再读《悟透javascript》之四、贪吃蛇
    前言     贪吃蛇是个很简单的小游戏,但是却很有趣,下面是我用JavaScript写的一个贪吃蛇的代码:  代码如下:   <htmlxmlns="http://www.w3.org/1999/xhtml"><headr......
  • 《悟透javascript》学习笔记:一、前言
    《悟透JavaScript》学习笔记  这是一本很形象生动的书,使我们可以更深地了解了JavaScript。 引言   编程世界里只存在两种基本元素,一个是数据,一个是代码。编程世界就......
  • 《悟透javascript》学习笔记:二、回归简单
    引言 要理解JavaScript,你得首先放下对象和类的概念,回到数据和代码的本原。前面说过,编程世界只有数据和代码两种基本元素,而这两种元素又有着纠缠不清的关系。JavaScript就......
  • 9、java类集
    类集是java中极其重要的是一个特性 常用集合接口1、 Collection接口,集合接口,用来存储一组对象,基于此接口又扩展了List(允许重复)、Set(不允许重复)等接口2、 Map接口,键值对......
  • 《悟透javascript》学习笔记:三、似类却不是类
    引言 JavaScript没有“类”的概念!这让很多学习过高级语言的人感到很不爽,其实比之于C语言又如何呢?显然JavaScript要比C语言好用很多。 不废话,上代码 <scriptlanguage="j......
  • 再读《悟透javascript》之三、甘露模型
    前言     甘露模型是用于开发基于javascript的类库的,通过它,我们可以以类似C#等面向对象的语言式的模式来开发javascript类库,这将使你的javascript代码变得清晰有条理......
  • 10、拦截器Interceptor的使用
    1          什么是拦截器拦截器可以在请求执行流程中的某个位置拦截请求并执行代码,也可以终止请求流程的执行 2          拦截器可以做什么拦截器通常......
  • Java流程控制(6)循环结构 while循环
             ......
  • 用Java敲出hello world
    用Java敲出HelloWorldProcess新建文件更改命名为Hello.java记住固定格式publicclassHello{ publicstaticvoidmain(String[]arges){ System.out.print('He......
  • Java线程中断机制
    在阅读AQS源码以及juc包很多基于AQS的应用源码过程中,会遇到很多interrupted相关的方法,这里复习一下java线程中断相关。要点:使用interrupt()中断一个线程,该方法只是标记中......