java反射使用整理1

2016-06-18 / 4 阅读 / Java

newInstance()获取类实例对象

实例:

public class ReflexTest {
    public static void main(String[] args){
        Class<U> uClass = U.class;
        try {
            U u = uClass.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}
class U{
}

结果:
运行正常!

实例:

public class ReflexTest {
    public static void main(String[] args){
        Class<U> uClass = U.class;
        try {
            U u = uClass.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}
class U{
    private U() {
    }
}

结果:

java.lang.IllegalAccessException: Class ReflexTest can not access a member of class U with modifiers "private"
	at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102)
	at java.lang.Class.newInstance(Class.java:436)
	at ReflexTest.main(ReflexTest.java:8)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

 

实例:

public class ReflexTest {
    public static void main(String[] args){
        Class<U> uClass = U.class;
        try {
            U u = uClass.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}
abstract class U{
}

结果:

java.lang.InstantiationException
	at sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(InstantiationExceptionConstructorAccessorImpl.java:48)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at java.lang.Class.newInstance(Class.java:442)
	at ReflexTest.main(ReflexTest.java:8)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

实例:

public class ReflexTest {
    public static void main(String[] args){
        Class<U> uClass = U.class;
        try {
            U u = uClass.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}
interface U{
}

结果:

java.lang.InstantiationException: U
	at java.lang.Class.newInstance(Class.java:427)
	at ReflexTest.main(ReflexTest.java:8)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Caused by: java.lang.NoSuchMethodException: U.<init>()
	at java.lang.Class.getConstructor0(Class.java:3082)
	at java.lang.Class.newInstance(Class.java:412)
	... 6 more
总结:
得到类对象后可以通过newInstance()获取该类的实例对象(默认构造函数私有,抽象类,接口的是无法通过该方法获取实例)

实例:

public class ReflexTest {
    public static void main(String[] args){
        Class<U> uClass = U.class;

        for (Annotation annotation : uClass.getAnnotations()) {
            System.out.println(annotation.toString());
        }

    }
}
@testAnnotation
@Deprecated
class U{
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface testAnnotation{
    int value() default -1;
}

结果:

@testAnnotation(value=-1)
@java.lang.Deprecated()

总结:
对于指定了生命周期为运行环境的注解总是可以通过getAnnotations()获得到他们的集合

 

isAnnotationPresent(xxx.class)

总结:

该方法用来查看(类,方法,参数,成员变量)是否被打上了对应的注解
相关推荐