Java反射
1.实例化Class类对象的方法有三种:
⑴. 通过forName()方法
⑵. 类.class;
⑶. 对象.getClass();
代码:
package com.test;
public class Test_Class {
public static void main ( String [] args ) {
A a = new A(); //实例化对象
System.out.println(a.getClass());
System.out.println(a.getClass().getName());
System.out.println(A.class);
try {
System.out.println(Class.forName("com.test.A"));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
class A{
}
结果:
class com.test.A
com.test.A
class com.test.A
class com.test.A
一旦实例化对象后可以更进一步的进行操作
例如:
package com.test;
public class Test_Class {
public static void main ( String [] args ) {
try {
A a = null ; //声明对象
Class<?> c = (Class) Class.forName("com.test.A"); // 得到
//A a = (A) Class.forName("com.test.A");因为返回的是一个Object类型 所以向下转型
System.out.println(c.getClass().getName()); //输出类名
a = (A)c.newInstance(); //实例化对象
a.setAge(10);
a.setName("test");
System.out.println(a);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
class A{
private String name ;
private int age ;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString(){
return "姓名 : " + this.name + " 年龄: " + this.age ;
}
}
结果:
class com.test.A
姓名 : test 年龄: 10
以上代码可以发现 如果不使用关键字new 也可以实例化一个对象并且必须包含一个无参构造方法 否则无法被实例化.
自己看了源码
import java.lang.reflect.InvocationTargetException; /** This interface provides the declaration for java.lang.reflect.Constructor.invoke(). Each Constructor object is configured with a (possibly dynamically-generated) class which implements this interface. */
/** Matches specification in {@link java.lang.reflect.Constructor} *//**大概意思是说此接口提供了java.lang.reflect.Constructor.invoke()的声明。每个构造的对象有可能是动态生成的类,它实现了这个接口。并且符合*/*java.lang.reflect.Constructor规范
如果必须使用有参构造函数的话可以.public interface ConstructorAccessor { public Object newInstance(Object[] args) throws InstantiationException, IllegalArgumentException, InvocationTargetException; }
1.通过Class类中getConstructors()方法取得本类中全部的构造函数.
2.想构造方法传递一个一个对象数组进去 里面包含了构造方法中所需的各个参数
3之后通过Constructor实例化对象
Constructor表示构造函数类
一般建议类中包含一个无参构造函数.
java.lang.reflect包中的常用类
1. Constructor 表示类中的构造函数
getModifiers(); 取得修饰符
getName(); 取得方法名
getParamenterTypes() 取得参数的类型
2. Field 表示类中的属性
3. Mehtod 表示类中的方法
这三个类都是 AccessibleObject类的子类
代码:
package com.test; import java.lang.reflect.Constructor; public class Test_Constructor { public static void main ( String [] args ) { try { //实例化对象 Class<?> c = Class.forName("com.test.TestUserImpl"); //取得类全部实现的接口 Class [] c1 = c.getInterfaces(); //取得类所继承的父类 Class<?> c2 = c.getSuperclass(); //取得类中的全部构造方法 Constructor<?>[] con = c.getConstructors(); for ( int i = 0 ; i < c1.length ; i++ ){ System.out.println(c + " 类全部实现的接口 : " + c1[i]); } System.out.println( c + " 类所继承的父类 : " + c2); System.out.println("-----------------------------------------------------------"); for( int i = 0 ; i < con.length ; i++ ){ //得到构造方法中的参数类型 Class<?>[] c4 = con[i].getParameterTypes(); System.out.println( c + " 构造方法 :" + con[i]); System.out.println( c + " 构造方法修饰符 :" + con[i].getModifiers()); System.out.println( c + " 方法名 :" + con[i].getName()); for ( int j = 0 ; j < c4.length ; j++ ){ System.out.println( c + " 参数类型 :" + c4[j].getName()); } if ( i < con.length -1 ){ System.out.println("-----------------------------------------------------------"); } } } catch (ClassNotFoundException e) { e.printStackTrace(); } } } interface ITestUser{ public static final String uname = "rock"; public static final int upass = 123; public void sayTest(); public String test(String s1 , String s2 ); } class TestUserImpl implements ITestUser{ private String sex ; private String tel ; public TestUserImpl(){ } public TestUserImpl( String sex ){ this.sex = sex ; } public TestUserImpl( String sex , String tel ){ this(sex) ; this.tel = tel ; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getTel() { return tel; } public void setTel(String tel) { this.tel = tel; } @Override public void sayTest() { // TODO Auto-generated method stub System.out.println("名字 : " + this.uname + " 密码: " + this.upass); } @Override public String test(String sex, String tel) { return "性别 : " + sex + " 电话: " + tel ; } }
结果:
class com.test.TestUserImpl 类全部实现的接口 : interface com.test.ITestUser class com.test.TestUserImpl 类所继承的父类 : class java.lang.Object ----------------------------------------------------------- class com.test.TestUserImpl 构造方法 :public com.test.TestUserImpl() class com.test.TestUserImpl 构造方法修饰符 :1 class com.test.TestUserImpl 方法名 :com.test.TestUserImpl ----------------------------------------------------------- class com.test.TestUserImpl 构造方法 :public com.test.TestUserImpl(java.lang.String,java.lang.String) class com.test.TestUserImpl 构造方法修饰符 :1 class com.test.TestUserImpl 方法名 :com.test.TestUserImpl class com.test.TestUserImpl 参数类型 :java.lang.String class com.test.TestUserImpl 参数类型 :java.lang.String ----------------------------------------------------------- class com.test.TestUserImpl 构造方法 :public com.test.TestUserImpl(java.lang.String) class com.test.TestUserImpl 构造方法修饰符 :1 class com.test.TestUserImpl 方法名 :com.test.TestUserImpl class com.test.TestUserImpl 参数类型 :java.lang.String //看 class com.test.TestUserImpl 构造方法修饰符 :1 得到的却是一个数字 因为java修饰符在底层是用数字表示的 //如果想把他换成我们看得懂的关键字 则必须使用Modifier类的toString(int mod);方法 // 修改代码:
int h = c4[j].getModifiers(); System.out.println("转换后的权限 : " + Modifier.toString(h)); //结果为: 转换后的权限 : public final