{学习笔记}[反射]
2016-07-23 15:56
363 查看
反射
基本概念
定义:反射就是加载累,并解刨出泪的各个组成部分(如成员变量,方法,构造方法等)
组成:
分为两部分:加载类 解剖类
加载类:(三种方法)
1.Class clazz=Class.forName(“/day01/src/reflact/Demo1.java”);
2.class clazz1=new Person().getClass();
3.Class clazz2=Person.class;
解剖类:
Class对象提供了各种方法 解剖出的成员分别使用Constructor (构造函数) Method(方法) Field(成员变量)对象表示
解剖出来干什么?
去使用!
构造函数——创建对象
字段——数据
方法——调用
反射
反射的构造方法:被反射的类:
public class Person {
String name;
public Person(){
System.out.println(“person”);
name=”创建成功”;
}
public Person(String name){
System.out.println(“person name”);
}
private Person(List list){
System.out.println(“person list”);
}
public void aa1(){ System.out.println("aa1"); } public void aa1(String name,int password){ System.out.println(name+":"+password); } public Class[] aa1(String name,int[] password){ return new Class[](String.class); } private void aa1(InputStream in){ System.out.println(in); } public void aa1(int num){ System.out.println(num); } }
反射的构造方法:
public class Demo2 {
@Test public void test1() throws Exception{ Class clazz=Class.forName("reflact.Person");//加载类 Constructor c=clazz.getConstructor(null);//获取类的无参构造函数 Person p = (Person)c.newInstance(null);//利用获取到的构造函数创建对象 System.out.println(p.name); } @Test public void test2() throws Exception{ Class clazz = Class.forName("reflact.Person"); Constructor c= clazz.getConstructor(String.class); Person p = (Person)c.newInstance("xxxx"); } //如果构造函数是私有的,可以采用暴力破解 @Test public void test4() throws Exception{ Class clazz =Class.forName("reflact.Person"); Constructor c = clazz.getDeclaredConstructor(List.class); c.setAccessible(true);//暴力反射 Person p =(Person)c.newInstance(new ArrayList()); System.out.println(p.name); } @Test public void test5() throws Exception{ Class clazz = Class.forName("reflact.Person"); Person p = (Person)clazz.newInstance();//构建对象的第二种方法 } }
构造方法总结:
public 方法 包访问方法可以用getConstructor来获取,但是private 只能用getDeclaredConstructor来访问
反射的方法:
import java.lang.reflect.Method; import org.junit.Test; public class Demo3 { //反射类的方法:public void aa1() @Test public void test1() throws Exception{ Person p =new Person(); Class clazz=Class.forName("reflact.Person"); Method method =clazz.getMethod("aa1",null); method.invoke(p, null);// 调用方法 p_对象,方法的参数 } //反射类的方法:public void aa1(String name,int password) @Test public void test2() throws Exception{ Person p =new Person(); Class clazz=Class.forName("reflact.Person"); Method method =clazz.getMethod("aa1",String.class,int .class); method.invoke(p, "zxx",99);// 调用方法 p_对象,方法的参数 } /*不会! //反射类的方法:public Class[] aa1(String name,int password) @Test public void test3() throws Exception{ Person p =new Person(); Class clazz=Class.forName("reflact.Person"); Method method =clazz.getMethod("aa1",String.class,int .class); method.invoke(p, "zxx",99);// 调用方法 p_对象,方法的参数 } */ //反射类的方法:public void aa1(Inputstream in) @Test public void test4() throws Exception{ Person p =new Person(); Class clazz=Class.forName("reflact.Person"); Method method =clazz.getMethod("aa1",String.class,int .class); method.invoke(p, "zxx",99);// 调用方法 p_对象,方法的参数 } }
静态方法的反射
public void test5() throws Exception{ //Person p = new Person();静态方法不需要对象 Class class =Class.forName("类名");//加载类 Method method =clazz.getMethod("aa1",int.class); method.invoke(nul,23); }
main的反射
残留问题= =!
反射类的字段
反射代码
import java.lang.reflect.Field; public class Demo5 { //反射字段 public String name = "aaaa"; public void test1() throws Exception{ Person p = new Person();//为了传递一个对象 Class clazz = Class.forName("reflact.Person"); Field f = clazz.getField("name"); String name=(String)f.getName(); System.out.println(name); Class type = f.getType(); System.out.println(type);//获取字段的类型 } }
可以自行判断字段类型
if(type.equals(String.class))
字段赋值
f.set(对象,“”);
静态字段的反射
居然也需要传入一个对象进去
相关文章推荐
- Java基础知识
- java基础(一)
- 怎样学习java,漫谈java学习之路
- 设置jdk环境变量时lib中的rt.jar ,dt.jar ,tool.jar是什么,作用是什么
- Java 集合系列11之 Hashtable详细介绍(源码解析)和使用示例
- 学习日志---treemap
- java基础知识笔记
- java中web应用中重定向与转发的区别
- java基础篇---枚举详解
- java基础第七天
- java基础第十天
- java基础第十二天
- java基础第十三天
- java基础第十四天
- java基础第十六天
- java基础第十七天
- java基础数据类型包装类
- equals与null
- java基础第三天_数组
- java基础第五天_静态代码块、类的继承和接口