首页 > 代码库 > 反射笔记
反射笔记
反射:
一个类有多个组成部分,
成员变量,方法,和构造函数,反射就是加载类,并解剖出
各个组成部分
//加载类
java中有一个Class类用于代表一个类的字节码
----------------------------------------------------------------------------
Reflect
//反射加载某个类Person
public class ReflectClass{
public static void main(String[] args){
//把硬盘上的字节码加载到内存中,在内存中就有一个clazz对象保存了
Class clazz=Class.forName("类的完整名称");
//其他的几种方式:
2.Class clazz2=new Person().getClass();
3.Class clazz3=Person.class;
//技巧:右键-Copy Qualified Name(复制类的完整类名)
Class对象提供了如下的常用方法
//得到public
public Constructor getConstructor<Class<?>...parameterTypes>
public Method getMethod(...);
public Field getField(...);
//得到所声明的方法
public Constructor getDeclaredConstructor();
public Method getDeclaredMethod(...);
public Field getDeclaredField(...);
//这些方法分别用于从类中解剖出构造函数,方法和成员变量(属性)
解剖出的成员分别使用Constructor,Method.Field对象表示
}
}
//解剖一个类的构造函数
public class Person{
public String name="hello";
public Person(){
System.out.println("person");
}
public person(String name){
System.out.println("person name");
}
public person(String name,int password){
System.out.println("person name password");
}
private Person(List list){
System.out.println("list");
}
//解剖构造函数,并创建类的对象
public class Demo{
//反射构造函数public Person(){}
@Test
public void test() throws Exception{
Class clazz1=Class.forName("Person");
Constructor c=clazz1.getConstructor(null);//参数控制你想解剖出哪个构造函数
Person p1=(Person)c.newInstance(null);
System.out.println(p1.name);
}
//反射构造函数public Person(String name)
@Test
public void test2() throws Exception{
Class clazz1=Class.forName("Person");
Constructor c=clazz1.getConstructor(String.class);//参数控制你想解剖出哪个构造函数
Person p1=(Person)c.newInstance("name");
System.out.println(p1.name);
}
//反射构造函数public Person(String name,int password)
@Test
public void test2() throws Exception{
Class clazz1=Class.forName("Person");
Constructor c=clazz1.getConstructor(String.class,Integer.class);//参数控制你想解剖出哪个构造函数
Person p1=(Person)c.newInstance("name",1900);
System.out.println(p1.name);
}
//反射构造函数public Person(List list)
@Test
public void test2() throws Exception{
Class clazz1=Class.forName("Person");
Constructor c=clazz1.getConstructor(List.list);//参数控制你想解剖出哪个构造函数
//关键代码-暴力反射
c.setAccessible(true);
Person p1=(Person)c.newInstance(new ArrayList());
System.out.println(p1.name);
//面试题:私有的不能访问,但反射可以实现访问。c.setAccessible(true);
//创建对象的另外一种途径
Class clazz=Class.forName("Person");
Person p=(Person)clazz.newInstance();
//反射出类的无参构造函数创建对象,意味着类中必须有无参的构造方法
System.out.println(p);
}
//反射Method执行方法
public void aa(){
System.out.println("");
}
public void aa(String name){
System.out.println(name);
}
public Class[] aa(String name,int[] password){
System.out.println(name+);
return new Class[](String.class);
}
private void aa(InputStream in){
System.out.println("in");
}
publiic static aa(){
System.out.println("static");
}
//反射代码
public class Demo{
//public void a(){}
@Test
Person p=new Person();
public void test(){
Class clazz=Class.forName("Person");
Method method=clazz.getMethod(null);
//import java.lang.reflect.Method
method.invoke(p,null);
//第一个参数是一个对象,第二个参数是一个方法中的参数类型
}
//反射方法public void a(String name,int password)
public void test2(){
Class clazz=Class.forName("Person");
Method method=clazz.getMethod("a",String.class,int.class);
//第一个参数是方法名
method.invoke(p,"hephec",39);
//第一个参数是一个对象,第二个参数是一个方法中的参数类型
}
//反射方法public Class[] a(String name,int[] password)
public void test2(){
Class clazz=Class.forName("Person");
Method method=clazz.getMethod("a",String.class,int[]class);
Class[] ca=(Class[])method.invoke(p,"aaa",new int[]{1,2,3});
System.out.println(cs[0]);
//第一个参数是方法名
method.invoke(p,"hephec",39);
//第一个参数是一个对象,第二个参数是一个方法中的参数类型
}
...//反射私有的方法getDeclaredMthod();
//反射静态方法
@test
public void test(){
Class clazz=Class.forName("Person");
Method method=clazz.getMethod("a",int.class);
//静态方法在调用时不需要对象
method.invoke(null,23);
}
}
//反射main方法
public static void main(String[] args)
{
System.out.println()"main";
}
@Test
public void test(){
Class clazz=Class.forName("Person");
Method method=clazz.getMethod("main",String[].class);
method.invoke(null,new String[]{"1","2","3"});
//不能执行
//解决方案:
method.invoke(null,new Object(new String[]{"1","2","3"}));
method.invoke(null,(Object)(new String[]{"1","2","3"}));
}
//反射字段
public void test(){
Class clazz=Class.forName("Person");
Field field=clazz.getField("name");
Object value=http://www.mamicode.com/f.get(p);//参数是一个对象
//获取字段的值
//有时候不知道反射的字段的类型
Class type=field.getType();
if(type.equals(String.class)){
String values=(String)value;
}
System.out.println(type);
}
//设置字段的值
f.set(p,"xxxxx");
System.out.printtn(p.name);
}
反射笔记
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。